rsmith added a comment.

In D71714#1792085 <https://reviews.llvm.org/D71714#1792085>, @efriedma wrote:

> To be rigorous, we should perform "pointer" checking for every operation that 
> performs pointer arithmetic.  Then we should perform "lvalue" checking (which 
> doesn't allow pointers one past the end) in the following places:
>
> 1. When we take the address of an lvalue.
> 2. When we form a reference to an lvalue.
> 3. When we perform an lvalue-to-rvalue conversion.
> 4. When we perform an assignment to an lvalue.
>
>   This sort of piecemeal approach of recursively looking through arbitrary 
> expressions seems likely to miss cases.  For example, we currently don't 
> perform checks inside compound literals.


I agree that this approach is not good. I'm concerned that your direction might 
still miss things, though (and it seems to involve a lot of AST traversal, 
which would be nice to avoid). For example, `__builtin_bitcast` performs a load 
without an lvalue-to-rvalue conversion, and to be thorough we'd need to 
special-case it. Perhaps we could instead:

- warn immediately when indexing outside [0, N] inclusive
- produce a deferred warning when indexing with index N, and diagnose at the 
end of the expression evaluation context
- remove elements from the list of deferred warnings when handling an `&` 
operator

In C at least, that should be correct in all cases. I think it's correct in C++ 
as well; there are lots more forms of lvalue to walk into in the third step 
(eg, `&(cond ? x[n] : y[n])` shouldn't warn), but it seems feasible to 
enumerate. (This would lose the warnings on `*&x[n]`, but I don't think that's 
a disaster.)


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D71714/new/

https://reviews.llvm.org/D71714



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to