[PATCH] More precise aliasing for char arrays

Arthur O'Dwyer arthur.j.odwyer at gmail.com
Wed Jun 25 19:34:58 PDT 2014


On Wed, Jun 25, 2014 at 3:26 PM, Sanjin Sijaric <ssijaric at codeaurora.org> wrote:
>
>>     int *p;
>>     typedef struct {
>>       char a;
>>       char b[100];
>>       char c;
>>     } S;
>>
>>     S x;
>>
>>     void func1 (char d) {
>>       for (int i = 0; i < 100; i++) {
>>         x.b[i] += 1;
>>         d = *p;
>>         x.a += d;
>>       }
>>     }
>>
>> It seems like you want the compiler to hoist the read of `*p` above the write to `x.b[i]`.
>> But that isn't generally possible, is it? because the caller might have executed
>>
>>    p = &x.b[3];
>>
>> before the call to func1.
>
> Here, "p" is a pointer to int, whereas b is a char array.  Wouldn't "p = &x.b[3];" break ansi aliasing rules?

I was under the impression that that was the entire point of "omnipotent char"!
See lines 106-108 in the very file you're changing:

00106     // Character types are special and can alias anything.
00107     // In C++, this technically only includes "char" and "unsigned char",
00108     // and not "signed char". In C, it includes all three. For now,
00109     // the risk of exploiting this detail in C++ seems likely to outweigh
00110     // the benefit.

Source: http://clang.llvm.org/doxygen/CodeGenTBAA_8cpp_source.html

–Arthur




More information about the cfe-commits mailing list