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