[PATCH] D139737: [-Wunsafe-buffer-usage] Initiate Fix-it generation for local variable declarations
Ziqing Luo via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Fri Jan 27 12:33:11 PST 2023
ziqingluo-90 marked 8 inline comments as done.
ziqingluo-90 added inline comments.
================
Comment at: clang/lib/Analysis/UnsafeBufferUsage.cpp:637
-static Strategy
-getNaiveStrategy(const llvm::SmallVectorImpl<const VarDecl *> &UnsafeVars) {
----------------
NoQ wrote:
> Hmm, did this need to be moved? I don't think you're calling this function from the new code.
it does look like I moved it. Will change it back.
================
Comment at: clang/lib/Analysis/UnsafeBufferUsage.cpp:780-781
+ } else {
+ // In cases `Init` is of the form `&Var` after stripping of implicit
+ // casts, where `&` is the built-in operator, the extent is 1.
+ if (auto AddrOfExpr = dyn_cast<UnaryOperator>(Init->IgnoreImpCasts()))
----------------
NoQ wrote:
> ```lang=c
> int x = 1;
> char *ptr = &x; // std::span<char> ptr { &x, 4 };
> ```
> This is valid code. I suspect we want to check types as well, to see that type sizes match.
>
> Most of the time code like this violates strict aliasing, but `char` is exceptional, and even if it did violate strict aliasing, people can compile with `-fno-strict-aliasing` to define away the UB, so we have to respect that.
This code is not valid in C++. An explicit cast is needed in front of `&x`. I will add a test to show that
```
int x = 1;
char * ptr = (char *)&x;
```
will have a place holder for the span size.
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D139737/new/
https://reviews.llvm.org/D139737
More information about the cfe-commits
mailing list