mirror of
https://github.com/intel/llvm.git
synced 2026-01-20 01:58:44 +08:00
The original intent of this commit was to catch potential null dereferences early, but it breaks the common "home-grown offsetof" idiom (PR13927): (((struct Foo *)0)->member - ((struct foo *)0)) As it turns out, this appears to be legal in C, per a footnote in C11 6.5.3.2: "Thus, &*E is equivalent to E (even if E is a null pointer)". In C++ this issue is still open: http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#232 We'll just have to make sure we have good path notes in the future. This reverts r164441 / 9be016dcd1ca3986873a7b66bd4bc027309ceb59. llvm-svn: 164958
29 lines
398 B
C
29 lines
398 B
C
// RUN: %clang_cc1 -analyze -analyzer-checker=core,alpha.core %s -analyzer-store=region -verify
|
|
|
|
unsigned foo();
|
|
typedef struct bf { unsigned x:2; } bf;
|
|
void bar() {
|
|
bf y;
|
|
*(unsigned*)&y = foo();
|
|
y.x = 1;
|
|
}
|
|
|
|
struct s {
|
|
int n;
|
|
};
|
|
|
|
void f() {
|
|
struct s a;
|
|
int *p = &(a.n) + 1;
|
|
}
|
|
|
|
typedef struct {
|
|
int x,y;
|
|
} Point;
|
|
|
|
Point getit(void);
|
|
void test() {
|
|
Point p;
|
|
(void)(p = getit()).x;
|
|
}
|