[llvm-branch-commits] [clang] 35232f3 - [analyzer] Fix crash exposed by D140059
Tom Stellard via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Wed Mar 8 05:57:09 PST 2023
Author: einvbri
Date: 2023-03-08T05:56:02-08:00
New Revision: 35232f3c40d2576ec94cad9e6b836f6f880d760b
URL: https://github.com/llvm/llvm-project/commit/35232f3c40d2576ec94cad9e6b836f6f880d760b
DIFF: https://github.com/llvm/llvm-project/commit/35232f3c40d2576ec94cad9e6b836f6f880d760b.diff
LOG: [analyzer] Fix crash exposed by D140059
Change https://reviews.llvm.org/D140059 exposed the following crash in
Z3Solver, where bit widths were not checked consistently with that
change. This change makes the check consistent, and fixes the crash.
```
clang: <root>/llvm/include/llvm/ADT/APSInt.h:99:
int64_t llvm::APSInt::getExtValue() const: Assertion
`isRepresentableByInt64() && "Too many bits for int64_t"' failed.
...
Stack dump:
0. Program arguments: clang -cc1 -internal-isystem <root>/lib/clang/16/include
-nostdsysteminc -analyze -analyzer-checker=core,unix.Malloc,debug.ExprInspection
-analyzer-config crosscheck-with-z3=true -verify reproducer.c
#0 0x00000000045b3476 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int)
<root>/llvm/lib/Support/Unix/Signals.inc:567:22
#1 0x00000000045b3862 PrintStackTraceSignalHandler(void*)
<root>/llvm/lib/Support/Unix/Signals.inc:641:1
#2 0x00000000045b14a5 llvm::sys::RunSignalHandlers()
<root>/llvm/lib/Support/Signals.cpp:104:20
#3 0x00000000045b2eb4 SignalHandler(int)
<root>/llvm/lib/Support/Unix/Signals.inc:412:1
...
#9 0x0000000004be2eb3 llvm::APSInt::getExtValue() const
<root>/llvm/include/llvm/ADT/APSInt.h:99:5
<root>/llvm/lib/Support/Z3Solver.cpp:740:53
clang::ASTContext&, clang::ento::SymExpr const*, llvm::APSInt const&, llvm::APSInt const&, bool)
<root>/clang/include/clang/StaticAnalyzer/Core/PathSensitive/SMTConv.h:552:61
```
Reviewed By: steakhal
Differential Revision: https://reviews.llvm.org/D142627
(cherry picked from commit f027dd55f32a3c1803fc3cbd53029acee849465c)
Added:
Modified:
clang/test/Analysis/z3-crosscheck.c
llvm/lib/Support/Z3Solver.cpp
Removed:
################################################################################
diff --git a/clang/test/Analysis/z3-crosscheck.c b/clang/test/Analysis/z3-crosscheck.c
index e0ec028c518d3..13f38f43e6974 100644
--- a/clang/test/Analysis/z3-crosscheck.c
+++ b/clang/test/Analysis/z3-crosscheck.c
@@ -77,3 +77,15 @@ void floatUnaryLNotInEq(int h, int l) {
// expected-warning at -1{{garbage}}
}
}
+
+// don't crash, and also produce a core.CallAndMessage finding
+void a(int);
+typedef struct {
+ int b;
+} c;
+c *d;
+void e() {
+ (void)d->b;
+ int f;
+ a(f); // expected-warning {{1st function call argument is an uninitialized value [core.CallAndMessage]}}
+}
diff --git a/llvm/lib/Support/Z3Solver.cpp b/llvm/lib/Support/Z3Solver.cpp
index a49bedcfd2b09..eb671fe2596db 100644
--- a/llvm/lib/Support/Z3Solver.cpp
+++ b/llvm/lib/Support/Z3Solver.cpp
@@ -729,7 +729,7 @@ class Z3Solver : public SMTSolver {
const Z3_sort Z3Sort = toZ3Sort(*getBitvectorSort(BitWidth)).Sort;
// Slow path, when 64 bits are not enough.
- if (LLVM_UNLIKELY(Int.getBitWidth() > 64u)) {
+ if (LLVM_UNLIKELY(!Int.isRepresentableByInt64())) {
SmallString<40> Buffer;
Int.toString(Buffer, 10);
return newExprRef(Z3Expr(
More information about the llvm-branch-commits
mailing list