| // RUN: %clang_analyze_cc1 -analyzer-checker=core,unix \ |
| // RUN: -analyzer-disable-checker=core.uninitialized \ |
| // RUN: -verify %s |
| |
| // NOTE: These tests correspond to examples provided in documentation |
| // of [[clang::suppress]]. If you break them intentionally, it's likely that |
| // you need to update the documentation! |
| |
| typedef __typeof(sizeof(int)) size_t; |
| void *malloc(size_t); |
| |
| int foo_initial() { |
| int *x = nullptr; |
| return *x; // expected-warning{{Dereference of null pointer (loaded from variable 'x')}} |
| } |
| |
| int foo1() { |
| int *x = nullptr; |
| [[clang::suppress]] |
| return *x; // null pointer dereference warning suppressed here |
| } |
| |
| int foo2() { |
| [[clang::suppress]] { |
| int *x = nullptr; |
| return *x; // null pointer dereference warning suppressed here |
| } |
| } |
| |
| int bar_initial(bool coin_flip) { |
| int *result = (int *)malloc(sizeof(int)); |
| if (coin_flip) |
| return 1; // There's no warning here YET, but it will show up if the other one is suppressed. |
| |
| return *result; // expected-warning{{Potential leak of memory pointed to by 'result'}} |
| } |
| |
| int bar1(bool coin_flip) { |
| __attribute__((suppress)) |
| int *result = (int *)malloc(sizeof(int)); |
| if (coin_flip) |
| return 1; // warning about this leak path is suppressed |
| |
| return *result; // warning about this leak path also suppressed |
| } |
| |
| int bar2(bool coin_flip) { |
| int *result = (int *)malloc(sizeof(int)); |
| if (coin_flip) |
| return 1; // expected-warning{{Potential leak of memory pointed to by 'result'}} |
| |
| __attribute__((suppress)) |
| return *result; // leak warning is suppressed only on this path |
| } |
| |
| class [[clang::suppress]] C { |
| int foo() { |
| int *x = nullptr; |
| return *x; // warnings suppressed in the entire class |
| } |
| |
| int bar(); |
| }; |
| |
| int C::bar() { |
| int *x = nullptr; |
| return *x; // expected-warning{{Dereference of null pointer (loaded from variable 'x')}} |
| } |