mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2025-02-26 13:26:22 +00:00
[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
This commit is contained in:
parent
6ceb32a66f
commit
53f75425b3
@ -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;
|
||||
|
22
clang/test/Analysis/bitwise-ops-nocrash.c
Normal file
22
clang/test/Analysis/bitwise-ops-nocrash.c
Normal file
@ -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;
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user