summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordanix800 <danix800@gmail.com>2023-03-07 08:41:30 +0100
committerTom Stellard <tstellar@redhat.com>2023-03-09 06:52:50 -0800
commit7fd255fe6e3551c06e9d233517576e95c9a912fe (patch)
treef7db9092797c58f3c146a71d19d7f267deee6c2f
parentf2ee0b25c3ad0039956d569ab63bbe53319a5e25 (diff)
downloadllvm-7fd255fe6e3551c06e9d233517576e95c9a912fe.tar.gz
[analyzer] Explicit cast on customized offsetof should not be ignored when evaluating as const
If ignored, the subexpr is a UnaryOperator (&) which cannot be evaluated (assertion failed). #define offsetof(type,memb) ((unsigned long)&((type*)0)->memb) Patch By danix800! Differential Revision: https://reviews.llvm.org/D144780 (cherry picked from commit 53f75425b3fec73d7a78e85e2b982741c9aa81f0)
-rw-r--r--clang/lib/StaticAnalyzer/Core/BugReporter.cpp2
-rw-r--r--clang/test/Analysis/bitwise-ops-nocrash.c22
2 files changed, 23 insertions, 1 deletions
diff --git a/clang/lib/StaticAnalyzer/Core/BugReporter.cpp b/clang/lib/StaticAnalyzer/Core/BugReporter.cpp
index a7f149b87e79..c3bd4876faf2 100644
--- a/clang/lib/StaticAnalyzer/Core/BugReporter.cpp
+++ b/clang/lib/StaticAnalyzer/Core/BugReporter.cpp
@@ -766,7 +766,7 @@ PathDiagnosticPieceRef PathDiagnosticBuilder::generateDiagForSwitchOP(
case Stmt::CaseStmtClass: {
os << "Control jumps to 'case ";
const auto *Case = cast<CaseStmt>(S);
- const Expr *LHS = Case->getLHS()->IgnoreParenCasts();
+ const Expr *LHS = Case->getLHS()->IgnoreParenImpCasts();
// Determine if it is an enum.
bool GetRawInt = true;
diff --git a/clang/test/Analysis/bitwise-ops-nocrash.c b/clang/test/Analysis/bitwise-ops-nocrash.c
new file mode 100644
index 000000000000..214acca78e6f
--- /dev/null
+++ b/clang/test/Analysis/bitwise-ops-nocrash.c
@@ -0,0 +1,22 @@
+// RUN: %clang_analyze_cc1 -analyzer-checker=core -analyzer-output=text -triple x86_64-linux-gnu -Wno-shift-count-overflow -verify %s
+
+#define offsetof(type,memb) ((unsigned long)&((type*)0)->memb)
+
+typedef struct {
+ unsigned long guest_counter;
+ unsigned int guest_fpc;
+} S;
+
+// no crash
+int left_shift_overflow_no_crash(unsigned int i) {
+ unsigned shift = 323U; // expected-note{{'shift' initialized to 323}}
+ switch (i) { // expected-note{{Control jumps to 'case 8:' at line 14}}
+ case offsetof(S, guest_fpc):
+ return 3 << shift; // expected-warning{{The result of the left shift is undefined due to shifting by '323', which is greater or equal to the width of type 'int'}}
+ // expected-note@-1{{The result of the left shift is undefined due to shifting by '323', which is greater or equal to the width of type 'int'}}
+ default:
+ break;
+ }
+
+ return 0;
+}