mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-27 00:56:06 +00:00

Currently, parameters of functions without their definition present cannot be represented as regions because it would be difficult to ensure that the same declaration is used in every case. To overcome this, we split `VarRegion` to two subclasses: `NonParamVarRegion` and `ParamVarRegion`. The latter does not store the `Decl` of the parameter variable. Instead it stores the index of the parameter which enables retrieving the actual `Decl` every time using the function declaration of the stack frame. To achieve this we also removed storing of `Decl` from `DeclRegion` and made `getDecl()` pure virtual. The individual `Decl`s are stored in the appropriate subclasses, such as `FieldRegion`, `ObjCIvarRegion` and the newly introduced `NonParamVarRegion`. Differential Revision: https://reviews.llvm.org/D80522
42 lines
1.5 KiB
C
42 lines
1.5 KiB
C
// RUN: %clang_analyze_cc1 -triple i386-apple-darwin10 -verify %s \
|
|
// RUN: -analyzer-checker=core.builtin \
|
|
// RUN: -analyzer-checker=debug.ExprInspection \
|
|
// RUN: -analyzer-checker=unix.cstring \
|
|
// RUN: -analyzer-config display-checker-name=false
|
|
|
|
struct S {
|
|
int z;
|
|
};
|
|
|
|
void clang_analyzer_explain_int(int);
|
|
void clang_analyzer_explain_voidp(void *);
|
|
void clang_analyzer_explain_S(struct S);
|
|
|
|
int glob;
|
|
|
|
void test_1(int param, void *ptr) {
|
|
clang_analyzer_explain_voidp(&glob); // expected-warning-re{{{{^pointer to global variable 'glob'$}}}}
|
|
clang_analyzer_explain_int(param); // expected-warning-re{{{{^argument 'param'$}}}}
|
|
clang_analyzer_explain_voidp(ptr); // expected-warning-re{{{{^argument 'ptr'$}}}}
|
|
if (param == 42)
|
|
clang_analyzer_explain_int(param); // expected-warning-re{{{{^signed 32-bit integer '42'$}}}}
|
|
}
|
|
|
|
void test_2(struct S s) {
|
|
clang_analyzer_explain_S(s); //expected-warning-re{{{{^lazily frozen compound value of parameter 's'$}}}}
|
|
clang_analyzer_explain_voidp(&s); // expected-warning-re{{{{^pointer to parameter 's'$}}}}
|
|
clang_analyzer_explain_int(s.z); // expected-warning-re{{{{^initial value of field 'z' of parameter 's'$}}}}
|
|
}
|
|
|
|
void test_3(int param) {
|
|
clang_analyzer_explain_voidp(¶m); // expected-warning-re{{{{^pointer to parameter 'param'$}}}}
|
|
}
|
|
|
|
void test_non_top_level(int param) {
|
|
clang_analyzer_explain_voidp(¶m); // expected-warning-re{{{{^pointer to parameter 'param'$}}}}
|
|
}
|
|
|
|
void test_4(int n) {
|
|
test_non_top_level(n);
|
|
}
|