|
2 | 2 | // RUN: %clang_analyze_cc1 -analyzer-checker=alpha.core.FixedAddr,alpha.core.PointerArithm,alpha.core.PointerSub,debug.ExprInspection -analyzer-store=region -Wno-pointer-to-int-cast -verify -triple i686-apple-darwin9 -Wno-tautological-pointer-compare -analyzer-config eagerly-assume=false %s
|
3 | 3 |
|
4 | 4 | void clang_analyzer_eval(int);
|
| 5 | +void clang_analyzer_dump(int); |
5 | 6 |
|
6 | 7 | void f1() {
|
7 | 8 | int a[10];
|
@@ -330,3 +331,59 @@ float test_nowarning_on_vector_deref() {
|
330 | 331 | simd_float2 x = {0, 1};
|
331 | 332 | return x[1]; // no-warning
|
332 | 333 | }
|
| 334 | + |
| 335 | +struct s { |
| 336 | + int v; |
| 337 | +}; |
| 338 | + |
| 339 | +// These three expressions should produce the same sym vals. |
| 340 | +void struct_pointer_canon(struct s *ps) { |
| 341 | + struct s ss = *ps; |
| 342 | + clang_analyzer_dump((*ps).v); |
| 343 | + // expected-warning-re@-1{{reg_${{[[:digit:]]+}}<int SymRegion{reg_${{[[:digit:]]+}}<struct s * ps>}.v>}} |
| 344 | + clang_analyzer_dump(ps[0].v); |
| 345 | + // expected-warning-re@-1{{reg_${{[[:digit:]]+}}<int SymRegion{reg_${{[[:digit:]]+}}<struct s * ps>}.v>}} |
| 346 | + clang_analyzer_dump(ps->v); |
| 347 | + // expected-warning-re@-1{{reg_${{[[:digit:]]+}}<int SymRegion{reg_${{[[:digit:]]+}}<struct s * ps>}.v>}} |
| 348 | + clang_analyzer_eval((*ps).v == ps[0].v); // expected-warning{{TRUE}} |
| 349 | + clang_analyzer_eval((*ps).v == ps->v); // expected-warning{{TRUE}} |
| 350 | + clang_analyzer_eval(ps[0].v == ps->v); // expected-warning{{TRUE}} |
| 351 | +} |
| 352 | + |
| 353 | +void struct_pointer_canon_bidim(struct s **ps) { |
| 354 | + struct s ss = **ps; |
| 355 | + clang_analyzer_eval(&(ps[0][0].v) == &((*ps)->v)); // expected-warning{{TRUE}} |
| 356 | +} |
| 357 | + |
| 358 | +typedef struct s T1; |
| 359 | +typedef struct s T2; |
| 360 | +void struct_pointer_canon_typedef(T1 *ps) { |
| 361 | + T2 ss = *ps; |
| 362 | + clang_analyzer_dump((*ps).v); |
| 363 | + // expected-warning-re@-1{{reg_${{[[:digit:]]+}}<int SymRegion{reg_${{[[:digit:]]+}}<T1 * ps>}.v>}} |
| 364 | + clang_analyzer_dump(ps[0].v); |
| 365 | + // expected-warning-re@-1{{reg_${{[[:digit:]]+}}<int SymRegion{reg_${{[[:digit:]]+}}<T1 * ps>}.v>}} |
| 366 | + clang_analyzer_dump(ps->v); |
| 367 | + // expected-warning-re@-1{{reg_${{[[:digit:]]+}}<int SymRegion{reg_${{[[:digit:]]+}}<T1 * ps>}.v>}} |
| 368 | + clang_analyzer_eval((*ps).v == ps[0].v); // expected-warning{{TRUE}} |
| 369 | + clang_analyzer_eval((*ps).v == ps->v); // expected-warning{{TRUE}} |
| 370 | + clang_analyzer_eval(ps[0].v == ps->v); // expected-warning{{TRUE}} |
| 371 | +} |
| 372 | + |
| 373 | +void struct_pointer_canon_bidim_typedef(T1 **ps) { |
| 374 | + T2 ss = **ps; |
| 375 | + clang_analyzer_eval(&(ps[0][0].v) == &((*ps)->v)); // expected-warning{{TRUE}} |
| 376 | +} |
| 377 | + |
| 378 | +void struct_pointer_canon_const(const struct s *ps) { |
| 379 | + struct s ss = *ps; |
| 380 | + clang_analyzer_dump((*ps).v); |
| 381 | + // expected-warning-re@-1{{reg_${{[[:digit:]]+}}<int SymRegion{reg_${{[[:digit:]]+}}<const struct s * ps>}.v>}} |
| 382 | + clang_analyzer_dump(ps[0].v); |
| 383 | + // expected-warning-re@-1{{reg_${{[[:digit:]]+}}<int SymRegion{reg_${{[[:digit:]]+}}<const struct s * ps>}.v>}} |
| 384 | + clang_analyzer_dump(ps->v); |
| 385 | + // expected-warning-re@-1{{reg_${{[[:digit:]]+}}<int SymRegion{reg_${{[[:digit:]]+}}<const struct s * ps>}.v>}} |
| 386 | + clang_analyzer_eval((*ps).v == ps[0].v); // expected-warning{{TRUE}} |
| 387 | + clang_analyzer_eval((*ps).v == ps->v); // expected-warning{{TRUE}} |
| 388 | + clang_analyzer_eval(ps[0].v == ps->v); // expected-warning{{TRUE}} |
| 389 | +} |
0 commit comments