diff options
author | Balazs Benics <benicsbalazs@gmail.com> | 2023-12-04 17:53:23 +0100 |
---|---|---|
committer | Balazs Benics <benicsbalazs@gmail.com> | 2023-12-28 16:06:21 +0100 |
commit | a49cf6c14ad498244fee6026da59cfdcdad6b80c (patch) | |
tree | 6dfc32f74575b7153e5552c0186d86117b0670b7 /clang/lib/StaticAnalyzer/Checkers/CStringChecker.cpp | |
parent | d1856b2f18c412f8ffbeee30e6e0316c197c143c (diff) | |
download | llvm-a49cf6c14ad498244fee6026da59cfdcdad6b80c.zip llvm-a49cf6c14ad498244fee6026da59cfdcdad6b80c.tar.gz llvm-a49cf6c14ad498244fee6026da59cfdcdad6b80c.tar.bz2 |
[analyzer] Fix "sprintf" parameter modeling in CStringChecker
`CE->getCalleeDecl()` returns `VarDecl` if the callee is actually a
function pointer variable. Consequently, calling `getAsFunction()` will
return null.
To workaround the case, we should use the `CallEvent::parameters()`,
which will internally recover the function being called and do the right
thing.
Fixes #74269
Depends on "[analyzer][NFC] Prefer CallEvent over CallExpr in APIs"
Diffstat (limited to 'clang/lib/StaticAnalyzer/Checkers/CStringChecker.cpp')
-rw-r--r-- | clang/lib/StaticAnalyzer/Checkers/CStringChecker.cpp | 3 |
1 files changed, 1 insertions, 2 deletions
diff --git a/clang/lib/StaticAnalyzer/Checkers/CStringChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/CStringChecker.cpp index f5dbf9d..b7b64c3 100644 --- a/clang/lib/StaticAnalyzer/Checkers/CStringChecker.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/CStringChecker.cpp @@ -2487,8 +2487,7 @@ void CStringChecker::evalSprintfCommon(CheckerContext &C, const CallEvent &Call, const auto *CE = cast<CallExpr>(Call.getOriginExpr()); DestinationArgExpr Dest = {{Call.getArgExpr(0), 0}}; - // FIXME: We should use `Call.parameters().size()` here. - const auto NumParams = CE->getCalleeDecl()->getAsFunction()->getNumParams(); + const auto NumParams = Call.parameters().size(); assert(CE->getNumArgs() >= NumParams); const auto AllArguments = |