llvm-project/clang/test/Analysis/call-and-message-argpointeeinitializedness.cpp
Balázs Kéri 5bfd57e7c9
[clang][analyzer] CallAndMessage warnings at pointer to uninitialized struct (#164600)
`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.
2025-12-17 09:46:24 +01:00

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