Skip to content

Commit

Permalink
[analyzer] Explicit cast on customized offsetof should not be ignored…
Browse files Browse the repository at this point in the history
… 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 53f7542)
  • Loading branch information
danix800 authored and tstellar committed Mar 9, 2023
1 parent f2ee0b2 commit 7fd255f
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 1 deletion.
2 changes: 1 addition & 1 deletion clang/lib/StaticAnalyzer/Core/BugReporter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
22 changes: 22 additions & 0 deletions clang/test/Analysis/bitwise-ops-nocrash.c
Original file line number Diff line number Diff line change
@@ -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;
}

0 comments on commit 7fd255f

Please sign in to comment.