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
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to