`CallAndMessageChecker` did have a warning for the case when pointer to uninitialized data is passed to a function when the argument type is pointer to const. This did not work for struct types. The check is improved to handle cases when struct with uninitialized data is passed to a function.
99 lines
2.4 KiB
C++
99 lines
2.4 KiB
C++
// 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')}}
|
|
}
|