rsmith added a comment.
This still looks like it will have has lots of false positives for cases like:
struct __attribute__((packed)) A {
char c;
int n;
} a;
void *p = &a.n;
It also looks like it will now have false negatives for cases like:
memcpy(x, y, *&a.n);
I think whitelisting specific functions is not a reasonable approach here;
instead, how about deferring the check until you see how the misaligned pointer
is used? A couple of approaches seem feasible:
- you could extend the conversion-checking code in SemaChecking to look for
such misaligned operations that are not immediately converted to a pointer type
with suitable (lower) alignment requirements
- you could build a list in Sema of the cases that are pending a diagnostic,
produce diagnostics at the end of the full-expression, and remove items from
the list when you see a suitable conversion applied to them
In any case, this diagnostic should apply to reference binding as well as
pointers.
GCC appears to check this as a separate step, at least after it applies its
fold; for example:
struct __attribute__((packed, aligned(4))) S { char c[4]; int n; } s;
int k;
int &r = true ? s.n : k; // gcc rejects, "cannot bind paced field 's.S::n' to
'int&'
int &s = false ? s.n : k; // gcc accepts
http://reviews.llvm.org/D20561
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits