[PATCH] D136162: [analyzer] Fix assertion failure in RegionStore within bindArray()

Balázs Benics via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Tue Oct 18 05:29:45 PDT 2022


steakhal created this revision.
steakhal added reviewers: NoQ, martong, Szelethus, ASDenysPetrov, tomasz-kaminski-sonarsource, xazax.hun, isuckatcs.
Herald added subscribers: manas, dkrupp, donat.nagy, mikhail.ramalho, a.sidorin, rnkovacs, szepet, baloghadamsoftware.
Herald added a project: All.
steakhal requested review of this revision.
Herald added a project: clang.
Herald added a subscriber: cfe-commits.

It turns out we can reach the `Init.castAs<nonlock::CompoundVal>()`
expression with other kinds of SVals. Such as by `nonloc::ConcreteInt`
in this example: https://godbolt.org/z/s4fdxrcs9

  int buffer[10];
  void b();
  void top() {
    b(&buffer);
  }
  void b(int *c) {
    *c = 42; // would crash
  }

In this example, we try to store `42` to the `Elem{buffer, 0}`.
A similar situation could happen if we reinterpret cast pointers, etc.
so the situation is not limited to conflicting function prototypes.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D136162

Files:
  clang/lib/StaticAnalyzer/Core/RegionStore.cpp
  clang/test/Analysis/region-store.c


Index: clang/test/Analysis/region-store.c
===================================================================
--- clang/test/Analysis/region-store.c
+++ clang/test/Analysis/region-store.c
@@ -1,4 +1,6 @@
-// RUN: %clang_analyze_cc1 -analyzer-checker=core,unix,debug.ExprInspection -verify -analyzer-config eagerly-assume=false %s
+// RUN: %clang_analyze_cc1 -analyzer-checker=core,unix,debug.ExprInspection \
+// RUN:    -verify -analyzer-config eagerly-assume=false -std=c99 %s \
+// RUN:    -Wno-implicit-function-declaration
 
 int printf(const char *restrict,...);
 
@@ -54,3 +56,13 @@
     clang_analyzer_eval(values[0] == 4);// expected-warning {{UNKNOWN}}
   }
 }
+
+int buffer[10];
+void b(); // 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 top() {
+  // expected-warning at +1 {{passing arguments to 'b' without a prototype is deprecated in all versions of C and is not supported in C2x}}
+  b(&buffer);
+}
+void b(int *c) { // expected-note {{conflicting prototype is here}}
+  *c = 42; // no-crash
+}
Index: clang/lib/StaticAnalyzer/Core/RegionStore.cpp
===================================================================
--- clang/lib/StaticAnalyzer/Core/RegionStore.cpp
+++ clang/lib/StaticAnalyzer/Core/RegionStore.cpp
@@ -2497,8 +2497,8 @@
     return bindAggregate(B, R, Init);
   }
 
-  if (Init.isUnknown())
-    return bindAggregate(B, R, UnknownVal());
+  if (!isa<nonloc::CompoundVal>(Init))
+    return bindAggregate(B, R, Init);
 
   // Remaining case: explicit compound values.
   const nonloc::CompoundVal& CV = Init.castAs<nonloc::CompoundVal>();


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D136162.468497.patch
Type: text/x-patch
Size: 1724 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20221018/b492f3bb/attachment.bin>


More information about the cfe-commits mailing list