-
Notifications
You must be signed in to change notification settings - Fork 10.8k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[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 53f7542)
- Loading branch information
Showing
2 changed files
with
23 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | ||
} |