|  | // 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')}} | 
|  | } |