[PATCH] D112551: [analyzer] Fix StringChecker for Unknown params
Balázs Benics via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Tue Oct 26 09:15:26 PDT 2021
This revision was landed with ongoing or failed builds.
This revision was automatically updated to reflect the committed changes.
Closed by commit rGc18407217e91: [analyzer] Fix StringChecker for Unknown params (authored by steakhal).
Herald added a project: clang.
Herald added a subscriber: cfe-commits.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D112551/new/
https://reviews.llvm.org/D112551
Files:
clang/lib/StaticAnalyzer/Checkers/StringChecker.cpp
clang/test/Analysis/std-string.cpp
Index: clang/test/Analysis/std-string.cpp
===================================================================
--- clang/test/Analysis/std-string.cpp
+++ clang/test/Analysis/std-string.cpp
@@ -8,6 +8,7 @@
void clang_analyzer_eval(bool);
void clang_analyzer_warnIfReached();
+template <typename T> void clang_analyzer_dump(T);
void free(void *ptr);
@@ -43,6 +44,12 @@
// expected-note at -2 {{The parameter must not be null}}
}
+void unknown_ctor_param(const char *p) {
+ // Pass 'UnknownVal' to the std::string constructor.
+ clang_analyzer_dump((char *)(p == 0)); // expected-warning {{Unknown}} expected-note {{Unknown}}
+ std::string x((char *)(p == 0)); // no-crash, no-warning
+}
+
void ctor_notetag_on_constraining_symbol(const char *p) {
clang_analyzer_eval(p == 0); // expected-warning {{UNKNOWN}} expected-note {{UNKNOWN}}
std::string x(p); // expected-note {{Assuming the pointer is not null}}
Index: clang/lib/StaticAnalyzer/Checkers/StringChecker.cpp
===================================================================
--- clang/lib/StaticAnalyzer/Checkers/StringChecker.cpp
+++ clang/lib/StaticAnalyzer/Checkers/StringChecker.cpp
@@ -67,15 +67,18 @@
CheckerContext &C) const {
if (!isCharToStringCtor(Call, C.getASTContext()))
return;
- const Loc Param = Call.getArgSVal(0).castAs<Loc>();
+ const auto Param = Call.getArgSVal(0).getAs<Loc>();
+ if (!Param.hasValue())
+ return;
// We managed to constrain the parameter to non-null.
ProgramStateRef NotNull, Null;
- std::tie(NotNull, Null) = C.getState()->assume(Param);
+ std::tie(NotNull, Null) = C.getState()->assume(*Param);
if (NotNull) {
const auto Callback = [Param](PathSensitiveBugReport &BR) -> std::string {
- return BR.isInteresting(Param) ? "Assuming the pointer is not null." : "";
+ return BR.isInteresting(*Param) ? "Assuming the pointer is not null."
+ : "";
};
// Emit note only if this operation constrained the pointer to be null.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D112551.382364.patch
Type: text/x-patch
Size: 2081 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20211026/62a33393/attachment-0001.bin>
More information about the cfe-commits
mailing list