[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