[PATCH] D136162: [analyzer] Fix assertion failure with conflicting prototype calls
Balázs Benics via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Mon Oct 24 01:30:17 PDT 2022
steakhal marked 2 inline comments as done.
steakhal added inline comments.
================
Comment at: clang/lib/StaticAnalyzer/Core/CallEvent.cpp:490
+ // edge-cases.
+ ArgVal = castArgToParamTypeIfNeeded(Call, Idx, ArgVal, SVB);
+
----------------
steakhal wrote:
> tomasz-kaminski-sonarsource wrote:
> > Previously we didng make bindings if `ArgVal` was unknown, and we may want to preserve this invariant.
> IDK what are the implications of not having a binding or having a binding to unknown.
> I'll change this anyway. Thanks for noticing.
Hm, I tried to move the `unknown` check after the cast. It would result in a difference in the last example:
```lang=C++
void c(); // expected-warning {{a function declaration without a prototype is deprecated in all versions of C and is treated as a zero-parameter prototype in C2x, conflicting with a subsequent definition}}
void missingPrototypeCallsiteMismatchingArgsAndParams() {
// expected-warning at +1 {{passing arguments to 'c' without a prototype is deprecated in all versions of C and is not supported in C2x}}
c(&buffer, &buffer);
}
void c(int *c) { // expected-note {{conflicting prototype is here}}
clang_analyzer_dump(c); // ???
*c = 42; // no-crash
}
```
The `clang_analyzer_dump(c)` would result in `&SymRegion{reg_$0<int * c>}` instead of `Unknown`.
Which is not exactly what I want. I want to bind `Unknown` in case the cast would result in `Unknown` or some weird parameter passing is detected, what we don't want to support/model, such as mismatching number of arguments & parameters, etc.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D136162/new/
https://reviews.llvm.org/D136162
More information about the cfe-commits
mailing list