crash with gcc and -Os on iOS

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



That's strange indeed. But we've had problem with certain gcc
optimizations before, https://trac.pjsip.org/repos/ticket/23, and just
as this one we also don't know what's going on.

Can you avoid the problem using a lighter expression than printf? Say,
with PJ_UNUSED_ARG(tmp_hdr.name.ptr).

Best regards,
?Benny


On Thu, Dec 16, 2010 at 5:13 PM,  <s.marek at avm.de> wrote:
> Hello,
>
> there's a strange issue with PJSIP 1.8.10 on iOS. XCodes default
> optimization level for Release builds is -Os. When compiled this way,
> PJSIPs header parser crashes on incoming calls.
> When compiling with -O2 or even -O3, everything works fine. XCode uses gcc
> 4.2 underneath.
>
> I've narrowed it down to a loop that copies header-values into a temporary
> header-structure in pjsip_dlg_update_remote_cap().
>
> ? ? ? ?while (hdr) {
> ? ? ? ? ? ? ? ?unsigned j;
> ? ? ? ? ? ? ? ?/* Append the header content to temporary header */
> ? ? ? ? ? ? ? ?for(j=0; j<hdr->count &&
> ?tmp_hdr.count<PJSIP_GENERIC_ARRAY_MAX_COUNT; ++j)
> ? ? ? ? ? ? ? ?{
> ? ? ? ? ? ? ? ? ? ? ? ?tmp_hdr.values[tmp_hdr.count++] = hdr->values[j];
> ? ? ? ? ? ? ? ?}
>
> ? ? ? ? ? ? ? ?/* Get the next header for this capability */
> ? ? ? ? ? ? ? ?hdr = (const pjsip_generic_array_hdr*)
> ? ? ? ? ? ? ? ? ? ? ? ?pjsip_msg_find_hdr(msg, htypes[i], hdr->next);
> ? ? ? ?}
>
> Looks good to me. But shortly after that, some pj_strdup (from
> pjsip_hdr_clone) tries to copy those strings from tmp_hdr.values and
> there's only garbage in tmp_hdr.values. tmp_hdr.count is fine though.
>
> When I modify the code by adding just a printf below(!!!) the while-loop,
> gcc's optimizer is brought back to sanity again and the values are copied
> just fine.
>
> ? ? ? ?while (hdr) {
> ? ? ? ? ? ? ? ?unsigned j;
> ? ? ? ? ? ? ? ?/* Append the header content to temporary header */
> ? ? ? ? ? ? ? ?for(j=0; j<hdr->count &&
> ?tmp_hdr.count<PJSIP_GENERIC_ARRAY_MAX_COUNT; ++j)
> ? ? ? ? ? ? ? ?{
> ? ? ? ? ? ? ? ? ? ? ? ?tmp_hdr.values[tmp_hdr.count++] = hdr->values[j];
> ? ? ? ? ? ? ? ?}
>
> ? ? ? ? ? ? ? ?/* Get the next header for this capability */
> ? ? ? ? ? ? ? ?hdr = (const pjsip_generic_array_hdr*)
> ? ? ? ? ? ? ? ? ? ? ? ?pjsip_msg_find_hdr(msg, htypes[i], hdr->next);
> ? ? ? ?}
> ? ? ? ?printf("[tmp_hdr] %s values (%d)\n", tmp_hdr.name.ptr,
> tmp_hdr.count);
>
> An alterative "fix" was to add a printf on some tmp_hdr value inside the
> inner for loop. So in the end I think, gcc gets something wrong by
> optimizing access to tmp_hdr too much.
>
> Does anyone know what the real source of the problem might be? What has
> Apple done to good old gcc? Or is this even reproducable on a Unix/Linux
> platform? Or is it just me?
>
> Thanks in advance for any comment,
> Sebastian.
>
> _______________________________________________
> Visit our blog: http://blog.pjsip.org
>
> pjsip mailing list
> pjsip at lists.pjsip.org
> http://lists.pjsip.org/mailman/listinfo/pjsip_lists.pjsip.org
>



[Index of Archives]     [Asterisk Users]     [Asterisk App Development]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Security]     [Bugtraq]     [Linux]     [Linux OMAP]     [Linux MIPS]     [Linux API]
  Powered by Linux