[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