| // RUN: %clang_analyze_cc1 %s -verify=initializedness-complete \ |
| // RUN: -analyzer-checker=core \ |
| // RUN: -analyzer-config core.CallAndMessage:ArgPointeeInitializedness=true \ |
| // RUN: -analyzer-config core.CallAndMessage:ArgPointeeInitializednessComplete=true \ |
| // RUN: -analyzer-config core.CallAndMessage:ArgInitializedness=false |
| |
| // RUN: %clang_analyze_cc1 %s -verify=initializedness-partial \ |
| // RUN: -analyzer-checker=core \ |
| // RUN: -analyzer-config core.CallAndMessage:ArgPointeeInitializedness=true \ |
| // RUN: -analyzer-config core.CallAndMessage:ArgInitializedness=false |
| |
| struct S1 { |
| char c; |
| }; |
| |
| struct S { |
| int a; |
| S1 b; |
| }; |
| |
| S GlobalS; |
| |
| void doStuffP(const S *); |
| void doStuffR(const S &); |
| |
| void uninit_val_p() { |
| S s; |
| doStuffP(&s); // initializedness-partial-warning{{1st function call argument points to an uninitialized value (e.g., field: 'a')}} \ |
| // initializedness-complete-warning{{1st function call argument points to an uninitialized value}} |
| } |
| |
| void uninit_val_r() { |
| S s; |
| doStuffR(s); // initializedness-partial-warning{{1st function call argument references an uninitialized value (e.g., field: 'a')}} \ |
| // initializedness-complete-warning{{1st function call argument references an uninitialized value}} |
| } |
| |
| S *uninit_new() { |
| S *s = new S; |
| doStuffP(s); // initializedness-partial-warning{{1st function call argument points to an uninitialized value (e.g., field: 'a')}} \ |
| // initializedness-complete-warning{{1st function call argument points to an uninitialized value}} |
| return s; |
| } |
| |
| void uninit_ctr() { |
| S s = S(); |
| doStuffP(&s); |
| } |
| |
| void uninit_init() { |
| S s{}; |
| doStuffP(&s); |
| } |
| |
| void uninit_init_val() { |
| S s{1, {2}}; |
| doStuffP(&s); |
| } |
| |
| void uninit_parm_ptr(S *s) { |
| doStuffP(s); |
| } |
| |
| void uninit_parm_val(S s) { |
| doStuffP(&s); |
| } |
| |
| void uninit_parm_ref(S &s) { |
| doStuffP(&s); |
| } |
| |
| void init_val() { |
| S s; |
| s.a = 1; |
| s.b.c = 1; |
| doStuffP(&s); |
| } |
| |
| void uninit_global() { |
| doStuffP(&GlobalS); |
| } |
| |
| void uninit_static() { |
| static S s; |
| doStuffP(&s); |
| } |
| |
| void uninit_val_partial_1() { |
| S s; |
| s.a = 1; |
| doStuffR(s); // initializedness-partial-warning{{1st function call argument references an uninitialized value (e.g., via the field chain: 'b.c')}} |
| } |
| |
| void uninit_val_partial_2() { |
| S s; |
| s.b.c = 1; |
| doStuffR(s); // initializedness-partial-warning{{1st function call argument references an uninitialized value (e.g., field: 'a')}} |
| } |