Stuart Henderson writes:

>> +make this function compile correctly under clang
>> +Index: lib/utils/mu-str.c
>> +--- lib/utils/mu-str.c.orig
>> ++++ lib/utils/mu-str.c
>> +@@ -49,7 +49,7 @@ mu_str_size_s  (size_t s)
>> + char*
>> + mu_str_size (size_t s)
>> + {
>> +-   return g_strdup (mu_str_size_s(s));
>> ++   return g_format_size_for_display ((goffset)s);
>> + }
>
> I'm no expert on glib2 but this seems a bit odd for "make this function
> compile correctly under clang", have you talked to upstream about it
> at all?
>

That patch is one I submitted, so I can elaborate.

The two functions involved look like this (unpatched):

const char*
mu_str_size_s  (size_t s)
{
        static char      buf[32];
        char            *tmp;

        tmp = g_format_size_for_display ((goffset)s);
        strncpy (buf, tmp, sizeof(buf));
        buf[sizeof(buf) -1] = '\0'; /* just in case */
        g_free (tmp);

        return buf;
}

char*
mu_str_size (size_t s)
{
        return g_strdup (mu_str_size_s(s));
}

One of the tests was failing, and I found this was because the compiler
was optimizing the function calls out of mu_str_size(), so that
it directly returned the address of mu_str_size_s()'s static buffer.

This happens with base-clang or ports-clang at -O1 or higher.

I just tried ports-gcc and it compiles mu_str_size() correctly, but the
build fails in the link stage. So maybe ports-gcc should be removed from
COMPILER unless that can be fixed.

Reply via email to