CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
418 lines
20 KiB
C++
418 lines
20 KiB
C++
// DEFINE: %{analyzer} = %clang_analyze_cc1 -Wno-array-bounds %s \
|
|
// DEFINE: -analyzer-checker=core,cplusplus,unix,debug.ExprInspection
|
|
|
|
// RUN: %{analyzer} -verify=default
|
|
// RUN: %{analyzer} -analyzer-config region-store-max-binding-fanout=10 -verify=limit10
|
|
// RUN: %{analyzer} -analyzer-config region-store-max-binding-fanout=0 -verify=unlimited
|
|
|
|
template <class T> void clang_analyzer_dump(T);
|
|
void clang_analyzer_eval(bool);
|
|
|
|
template <class... Ts> void escape(Ts...);
|
|
bool coin();
|
|
|
|
class Loc {
|
|
int x;
|
|
};
|
|
class P1 {
|
|
public:
|
|
Loc l;
|
|
void setLoc(Loc L) {
|
|
l = L;
|
|
}
|
|
|
|
};
|
|
class P2 {
|
|
public:
|
|
int m;
|
|
int accessBase() {
|
|
return m;
|
|
}
|
|
};
|
|
class Derived: public P1, public P2 {
|
|
};
|
|
int radar13445834(Derived *Builder, Loc l) {
|
|
Builder->setLoc(l);
|
|
return Builder->accessBase();
|
|
|
|
}
|
|
|
|
void boundedNumberOfBindings() {
|
|
int array[] {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22};
|
|
clang_analyzer_dump(array[0]); // default-warning {{0 S32b}} unlimited-warning {{0 S32b}} limit10-warning {{0 S32b}}
|
|
clang_analyzer_dump(array[1]); // default-warning {{1 S32b}} unlimited-warning {{1 S32b}} limit10-warning {{1 S32b}}
|
|
clang_analyzer_dump(array[2]); // default-warning {{2 S32b}} unlimited-warning {{2 S32b}} limit10-warning {{2 S32b}}
|
|
clang_analyzer_dump(array[3]); // default-warning {{3 S32b}} unlimited-warning {{3 S32b}} limit10-warning {{3 S32b}}
|
|
clang_analyzer_dump(array[4]); // default-warning {{4 S32b}} unlimited-warning {{4 S32b}} limit10-warning {{4 S32b}}
|
|
clang_analyzer_dump(array[5]); // default-warning {{5 S32b}} unlimited-warning {{5 S32b}} limit10-warning {{5 S32b}}
|
|
clang_analyzer_dump(array[6]); // default-warning {{6 S32b}} unlimited-warning {{6 S32b}} limit10-warning {{6 S32b}}
|
|
clang_analyzer_dump(array[7]); // default-warning {{7 S32b}} unlimited-warning {{7 S32b}} limit10-warning {{7 S32b}}
|
|
clang_analyzer_dump(array[8]); // default-warning {{8 S32b}} unlimited-warning {{8 S32b}} limit10-warning {{8 S32b}}
|
|
clang_analyzer_dump(array[9]); // default-warning {{9 S32b}} unlimited-warning {{9 S32b}} limit10-warning {{9 S32b}}
|
|
clang_analyzer_dump(array[10]); // default-warning {{10 S32b}} unlimited-warning {{10 S32b}} limit10-warning {{Unknown}}
|
|
clang_analyzer_dump(array[11]); // default-warning {{11 S32b}} unlimited-warning {{11 S32b}} limit10-warning {{Unknown}}
|
|
clang_analyzer_dump(array[12]); // default-warning {{12 S32b}} unlimited-warning {{12 S32b}} limit10-warning {{Unknown}}
|
|
clang_analyzer_dump(array[13]); // default-warning {{13 S32b}} unlimited-warning {{13 S32b}} limit10-warning {{Unknown}}
|
|
clang_analyzer_dump(array[14]); // default-warning {{14 S32b}} unlimited-warning {{14 S32b}} limit10-warning {{Unknown}}
|
|
clang_analyzer_dump(array[15]); // default-warning {{15 S32b}} unlimited-warning {{15 S32b}} limit10-warning {{Unknown}}
|
|
clang_analyzer_dump(array[16]); // default-warning {{16 S32b}} unlimited-warning {{16 S32b}} limit10-warning {{Unknown}}
|
|
clang_analyzer_dump(array[17]); // default-warning {{17 S32b}} unlimited-warning {{17 S32b}} limit10-warning {{Unknown}}
|
|
clang_analyzer_dump(array[18]); // default-warning {{18 S32b}} unlimited-warning {{18 S32b}} limit10-warning {{Unknown}}
|
|
clang_analyzer_dump(array[19]); // default-warning {{19 S32b}} unlimited-warning {{19 S32b}} limit10-warning {{Unknown}}
|
|
clang_analyzer_dump(array[20]); // default-warning {{20 S32b}} unlimited-warning {{20 S32b}} limit10-warning {{Unknown}}
|
|
clang_analyzer_dump(array[21]); // default-warning {{21 S32b}} unlimited-warning {{21 S32b}} limit10-warning {{Unknown}}
|
|
clang_analyzer_dump(array[22]); // default-warning {{22 S32b}} unlimited-warning {{22 S32b}} limit10-warning {{Unknown}}
|
|
clang_analyzer_dump(array[23]); // see below see below limit10-warning {{Unknown}}
|
|
// default-warning@-1 {{1st function call argument is an uninitialized value}}
|
|
// unlimited-warning@-2 {{1st function call argument is an uninitialized value}}
|
|
// FIXME: The last dump at index 23 should be Undefined due to out of bounds access.
|
|
}
|
|
|
|
void incompleteInitList() {
|
|
int array[23] {0,1,2,3,4,5,6,7,8,9,10,11 /*rest are zeroes*/ };
|
|
clang_analyzer_dump(array[0]); // default-warning {{0 S32b}} unlimited-warning {{0 S32b}} limit10-warning {{0 S32b}}
|
|
clang_analyzer_dump(array[1]); // default-warning {{1 S32b}} unlimited-warning {{1 S32b}} limit10-warning {{1 S32b}}
|
|
clang_analyzer_dump(array[2]); // default-warning {{2 S32b}} unlimited-warning {{2 S32b}} limit10-warning {{2 S32b}}
|
|
clang_analyzer_dump(array[3]); // default-warning {{3 S32b}} unlimited-warning {{3 S32b}} limit10-warning {{3 S32b}}
|
|
clang_analyzer_dump(array[4]); // default-warning {{4 S32b}} unlimited-warning {{4 S32b}} limit10-warning {{4 S32b}}
|
|
clang_analyzer_dump(array[5]); // default-warning {{5 S32b}} unlimited-warning {{5 S32b}} limit10-warning {{5 S32b}}
|
|
clang_analyzer_dump(array[6]); // default-warning {{6 S32b}} unlimited-warning {{6 S32b}} limit10-warning {{6 S32b}}
|
|
clang_analyzer_dump(array[7]); // default-warning {{7 S32b}} unlimited-warning {{7 S32b}} limit10-warning {{7 S32b}}
|
|
clang_analyzer_dump(array[8]); // default-warning {{8 S32b}} unlimited-warning {{8 S32b}} limit10-warning {{8 S32b}}
|
|
clang_analyzer_dump(array[9]); // default-warning {{9 S32b}} unlimited-warning {{9 S32b}} limit10-warning {{9 S32b}}
|
|
clang_analyzer_dump(array[10]); // default-warning {{10 S32b}} unlimited-warning {{10 S32b}} limit10-warning {{Unknown}}
|
|
clang_analyzer_dump(array[11]); // default-warning {{11 S32b}} unlimited-warning {{11 S32b}} limit10-warning {{Unknown}}
|
|
clang_analyzer_dump(array[12]); // default-warning {{0 S32b}} unlimited-warning {{0 S32b}} limit10-warning {{Unknown}}
|
|
clang_analyzer_dump(array[13]); // default-warning {{0 S32b}} unlimited-warning {{0 S32b}} limit10-warning {{Unknown}}
|
|
clang_analyzer_dump(array[14]); // default-warning {{0 S32b}} unlimited-warning {{0 S32b}} limit10-warning {{Unknown}}
|
|
clang_analyzer_dump(array[15]); // default-warning {{0 S32b}} unlimited-warning {{0 S32b}} limit10-warning {{Unknown}}
|
|
clang_analyzer_dump(array[16]); // default-warning {{0 S32b}} unlimited-warning {{0 S32b}} limit10-warning {{Unknown}}
|
|
clang_analyzer_dump(array[17]); // default-warning {{0 S32b}} unlimited-warning {{0 S32b}} limit10-warning {{Unknown}}
|
|
clang_analyzer_dump(array[18]); // default-warning {{0 S32b}} unlimited-warning {{0 S32b}} limit10-warning {{Unknown}}
|
|
clang_analyzer_dump(array[19]); // default-warning {{0 S32b}} unlimited-warning {{0 S32b}} limit10-warning {{Unknown}}
|
|
clang_analyzer_dump(array[20]); // default-warning {{0 S32b}} unlimited-warning {{0 S32b}} limit10-warning {{Unknown}}
|
|
clang_analyzer_dump(array[21]); // default-warning {{0 S32b}} unlimited-warning {{0 S32b}} limit10-warning {{Unknown}}
|
|
clang_analyzer_dump(array[22]); // default-warning {{0 S32b}} unlimited-warning {{0 S32b}} limit10-warning {{Unknown}}
|
|
clang_analyzer_dump(array[23]); // default-warning {{0 S32b}} unlimited-warning {{0 S32b}} limit10-warning {{Unknown}}
|
|
// FIXME: The last dump at index 23 should be Undefined due to out of bounds access.
|
|
}
|
|
|
|
struct Inner {
|
|
int first;
|
|
int second;
|
|
};
|
|
struct Outer {
|
|
Inner upper;
|
|
Inner lower;
|
|
};
|
|
|
|
void nestedStructInitLists() {
|
|
Outer array[]{ // 7*4: 28 values
|
|
{{00, 01}, {02, 03}},
|
|
{{10, 11}, {12, 13}},
|
|
{{20, 21}, {22, 23}},
|
|
{{30, 31}, {32, 33}},
|
|
{{40, 41}, {42, 43}},
|
|
{{50, 51}, {52, 53}},
|
|
{{60, 61}, {62, 63}},
|
|
};
|
|
|
|
int *p = (int*)array;
|
|
clang_analyzer_dump(p[0]); // default-warning {{0 S32b}} unlimited-warning {{0 S32b}} limit10-warning {{0 S32b}}
|
|
clang_analyzer_dump(p[1]); // default-warning {{1 S32b}} unlimited-warning {{1 S32b}} limit10-warning {{1 S32b}}
|
|
clang_analyzer_dump(p[2]); // default-warning {{2 S32b}} unlimited-warning {{2 S32b}} limit10-warning {{2 S32b}}
|
|
clang_analyzer_dump(p[3]); // default-warning {{3 S32b}} unlimited-warning {{3 S32b}} limit10-warning {{3 S32b}}
|
|
clang_analyzer_dump(p[4]); // default-warning {{10 S32b}} unlimited-warning {{10 S32b}} limit10-warning {{10 S32b}}
|
|
clang_analyzer_dump(p[5]); // default-warning {{11 S32b}} unlimited-warning {{11 S32b}} limit10-warning {{11 S32b}}
|
|
clang_analyzer_dump(p[6]); // default-warning {{12 S32b}} unlimited-warning {{12 S32b}} limit10-warning {{12 S32b}}
|
|
clang_analyzer_dump(p[7]); // default-warning {{13 S32b}} unlimited-warning {{13 S32b}} limit10-warning {{13 S32b}}
|
|
clang_analyzer_dump(p[8]); // default-warning {{20 S32b}} unlimited-warning {{20 S32b}} limit10-warning {{20 S32b}}
|
|
clang_analyzer_dump(p[9]); // default-warning {{21 S32b}} unlimited-warning {{21 S32b}} limit10-warning {{21 S32b}}
|
|
clang_analyzer_dump(p[10]); // default-warning {{22 S32b}} unlimited-warning {{22 S32b}} limit10-warning {{Unknown}}
|
|
clang_analyzer_dump(p[11]); // default-warning {{23 S32b}} unlimited-warning {{23 S32b}} limit10-warning {{Unknown}}
|
|
clang_analyzer_dump(p[12]); // default-warning {{30 S32b}} unlimited-warning {{30 S32b}} limit10-warning {{Unknown}}
|
|
clang_analyzer_dump(p[13]); // default-warning {{31 S32b}} unlimited-warning {{31 S32b}} limit10-warning {{Unknown}}
|
|
clang_analyzer_dump(p[14]); // default-warning {{32 S32b}} unlimited-warning {{32 S32b}} limit10-warning {{Unknown}}
|
|
clang_analyzer_dump(p[15]); // default-warning {{33 S32b}} unlimited-warning {{33 S32b}} limit10-warning {{Unknown}}
|
|
clang_analyzer_dump(p[16]); // default-warning {{40 S32b}} unlimited-warning {{40 S32b}} limit10-warning {{Unknown}}
|
|
clang_analyzer_dump(p[17]); // default-warning {{41 S32b}} unlimited-warning {{41 S32b}} limit10-warning {{Unknown}}
|
|
clang_analyzer_dump(p[18]); // default-warning {{42 S32b}} unlimited-warning {{42 S32b}} limit10-warning {{Unknown}}
|
|
clang_analyzer_dump(p[19]); // default-warning {{43 S32b}} unlimited-warning {{43 S32b}} limit10-warning {{Unknown}}
|
|
clang_analyzer_dump(p[20]); // default-warning {{50 S32b}} unlimited-warning {{50 S32b}} limit10-warning {{Unknown}}
|
|
clang_analyzer_dump(p[21]); // default-warning {{51 S32b}} unlimited-warning {{51 S32b}} limit10-warning {{Unknown}}
|
|
clang_analyzer_dump(p[22]); // default-warning {{52 S32b}} unlimited-warning {{52 S32b}} limit10-warning {{Unknown}}
|
|
clang_analyzer_dump(p[23]); // default-warning {{53 S32b}} unlimited-warning {{53 S32b}} limit10-warning {{Unknown}}
|
|
clang_analyzer_dump(p[24]); // default-warning {{60 S32b}} unlimited-warning {{60 S32b}} limit10-warning {{Unknown}}
|
|
clang_analyzer_dump(p[25]); // default-warning {{61 S32b}} unlimited-warning {{61 S32b}} limit10-warning {{Unknown}}
|
|
clang_analyzer_dump(p[26]); // default-warning {{62 S32b}} unlimited-warning {{62 S32b}} limit10-warning {{Unknown}}
|
|
clang_analyzer_dump(p[27]); // default-warning {{63 S32b}} unlimited-warning {{63 S32b}} limit10-warning {{Unknown}}
|
|
clang_analyzer_dump(p[28]); // see below see below limit10-warning {{Unknown}}
|
|
// default-warning@-1 {{1st function call argument is an uninitialized value}}
|
|
// unlimited-warning@-2 {{1st function call argument is an uninitialized value}}
|
|
// FIXME: The last dump at index 28 should be Undefined due to out of bounds access.
|
|
}
|
|
|
|
void expectNoLeaksInWidenedInitLists() {
|
|
int *p[] {
|
|
new int(0),
|
|
new int(1),
|
|
new int(2),
|
|
new int(3),
|
|
new int(4),
|
|
new int(5),
|
|
new int(6),
|
|
new int(7),
|
|
new int(8),
|
|
new int(9),
|
|
new int(10),
|
|
new int(11),
|
|
new int(12),
|
|
new int(13),
|
|
new int(14),
|
|
new int(15),
|
|
new int(16),
|
|
new int(17),
|
|
new int(18),
|
|
new int(19),
|
|
new int(20),
|
|
new int(21),
|
|
new int(22),
|
|
new int(23),
|
|
new int(24),
|
|
};
|
|
clang_analyzer_dump(*p[0]); // default-warning {{0 S32b}} unlimited-warning {{0 S32b}} limit10-warning {{0 S32b}}
|
|
clang_analyzer_dump(*p[12]); // default-warning {{12 S32b}} unlimited-warning {{12 S32b}} limit10-warning {{Unknown}}
|
|
escape(p); // no-leaks
|
|
}
|
|
|
|
void rawArrayWithSelfReference() {
|
|
// If a pointer to some object escapes, that pointed object should escape too.
|
|
// Consequently, if the 22th initializer would escape, then the p[6] should also escape - clobbering any loads from that location later.
|
|
int *p[25] = {
|
|
new int(0),
|
|
new int(1),
|
|
new int(2),
|
|
new int(3),
|
|
new int(4),
|
|
new int(5),
|
|
new int(6),
|
|
new int(7),
|
|
p[5], // Should be a pointer to the 6th array element, but we get Undefined as the analyzer thinks that "p" is not yet initialized, thus loading from index 5 is UB. This is wrong.
|
|
new int(9),
|
|
new int(10),
|
|
new int(11),
|
|
new int(12),
|
|
new int(13),
|
|
new int(14),
|
|
new int(15),
|
|
new int(16),
|
|
new int(17),
|
|
new int(18),
|
|
new int(19),
|
|
new int(20),
|
|
new int(21),
|
|
p[6], // Should be a pointer to the 6th array element, but we get Undefined as the analyzer thinks that "p" is not yet initialized, thus loading from index 5 is UB. This is wrong.
|
|
new int(23),
|
|
new int(24),
|
|
};
|
|
clang_analyzer_dump(*p[5]); // default-warning {{5 S32b}} unlimited-warning {{5 S32b}} limit10-warning {{5 S32b}}
|
|
clang_analyzer_dump(*p[6]); // default-warning {{6 S32b}} unlimited-warning {{6 S32b}} limit10-warning {{6 S32b}}
|
|
|
|
if (coin()) {
|
|
clang_analyzer_dump(*p[8]);
|
|
// default-warning@-1 {{Dereference of undefined pointer value}}
|
|
// unlimited-warning@-2 {{Dereference of undefined pointer value}}
|
|
// limit10-warning@-3 {{Dereference of undefined pointer value}}
|
|
}
|
|
|
|
clang_analyzer_dump(*p[12]); // default-warning {{12 S32b}} unlimited-warning {{12 S32b}} limit10-warning {{Unknown}}
|
|
|
|
if (coin()) {
|
|
clang_analyzer_dump(*p[22]);
|
|
// default-warning@-1 {{Dereference of undefined pointer value}}
|
|
// unlimited-warning@-2 {{Dereference of undefined pointer value}}
|
|
// limit10-warning@-3 {{Unknown}}
|
|
}
|
|
|
|
clang_analyzer_dump(*p[23]); // default-warning {{23 S32b}} unlimited-warning {{23 S32b}} limit10-warning {{Unknown}}
|
|
|
|
escape(p); // no-leaks
|
|
}
|
|
|
|
template <class T, unsigned Size> struct BigArray {
|
|
T array[Size];
|
|
};
|
|
|
|
void fieldArrayWithSelfReference() {
|
|
// Similar to "rawArrayWithSelfReference", but using an aggregate object and assignment operator to achieve the element-wise binds.
|
|
BigArray<int *, 25> p;
|
|
p = {
|
|
new int(0),
|
|
new int(1),
|
|
new int(2),
|
|
new int(3),
|
|
new int(4),
|
|
new int(5),
|
|
new int(6),
|
|
new int(7),
|
|
p.array[5], // Pointer to the 6th array element.
|
|
new int(9),
|
|
new int(10),
|
|
new int(11),
|
|
new int(12),
|
|
new int(13),
|
|
new int(14),
|
|
new int(15),
|
|
new int(16),
|
|
new int(17),
|
|
new int(18),
|
|
new int(19),
|
|
new int(20),
|
|
new int(21),
|
|
p.array[6], // Pointer to the 7th array element.
|
|
new int(23),
|
|
new int(24),
|
|
};
|
|
clang_analyzer_dump(*p.array[5]); // default-warning {{5 S32b}} unlimited-warning {{5 S32b}} limit10-warning {{5 S32b}}
|
|
clang_analyzer_dump(*p.array[6]); // default-warning {{6 S32b}} unlimited-warning {{6 S32b}} limit10-warning {{6 S32b}}
|
|
|
|
if (coin()) {
|
|
clang_analyzer_dump(*p.array[8]);
|
|
// default-warning@-1 {{Unknown}}
|
|
// unlimited-warning@-2 {{Unknown}}
|
|
// limit10-warning@-3 {{Unknown}}
|
|
}
|
|
|
|
clang_analyzer_dump(*p.array[12]); // default-warning {{12 S32b}} unlimited-warning {{12 S32b}} limit10-warning {{Unknown}}
|
|
|
|
if (coin()) {
|
|
clang_analyzer_dump(*p.array[22]);
|
|
// default-warning@-1 {{Unknown}}
|
|
// unlimited-warning@-2 {{Unknown}}
|
|
// limit10-warning@-3 {{Unknown}}
|
|
}
|
|
|
|
clang_analyzer_dump(*p.array[23]); // default-warning {{23 S32b}} unlimited-warning {{23 S32b}} limit10-warning {{Unknown}}
|
|
|
|
escape(p); // no-leaks
|
|
}
|
|
|
|
struct PtrHolderBase {
|
|
int *ptr;
|
|
};
|
|
struct BigStruct : BigArray<int, 1000>, PtrHolderBase {};
|
|
void largeBaseClasses() {
|
|
BigStruct D{{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24}, {new int(25)}};
|
|
(void)D; // no-leak here, the PtrHolderBase subobject is properly escaped.
|
|
|
|
clang_analyzer_dump(*D.ptr); // default-warning {{25 S32b}} unlimited-warning {{25 S32b}} limit10-warning {{Unknown}}
|
|
escape(D);
|
|
}
|
|
|
|
struct List {
|
|
int* ptr;
|
|
BigArray<int, 30> head;
|
|
List *tail;
|
|
};
|
|
void tempObjectMayEscapeArgumentsInAssignment() {
|
|
// This will be leaked after the assignment. However, we should not diagnose
|
|
// this because in the RHS of the assignment the temporary couldn't be really
|
|
// materialized due to the number of bindings, thus the address of `l` will
|
|
// escape there.
|
|
List l{new int(404)};
|
|
|
|
// ExprWithCleanups wraps the assignment operator call, which assigns a MaterializeTemporaryExpr.
|
|
l = List{new int(42), {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24}, &l};
|
|
(void)l;
|
|
// default-warning@-1 {{Potential memory leak}} We detect the leak with the default settings.
|
|
// unlimited-warning@-2 {{Potential memory leak}} We detect the leak with the default settings.
|
|
// limit10 is missing! It's because in that case we escape `&l`, thus we assume freed. This is good.
|
|
|
|
clang_analyzer_dump(*l.ptr); // default-warning {{42 S32b}} unlimited-warning {{42 S32b}} limit10-warning {{42 S32b}}
|
|
escape(l);
|
|
}
|
|
|
|
void tempObjNotMaterializedThusDoesntEscapeAnything() {
|
|
List l{new int(404)};
|
|
// We have no ExprWithCleanups or MaterializeTemporaryExpr here, so `&l` is never escaped. This is good.
|
|
(void)List{new int(42), {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24}, &l};
|
|
(void)l;
|
|
// default-warning@-1 {{Potential memory leak}} We detect the leak with the default settings.
|
|
// limit10-warning@-2 {{Potential memory leak}} We detect the leak with the default settings.
|
|
// unlimited-warning@-3 {{Potential memory leak}} We detect the leak with the default settings.
|
|
|
|
clang_analyzer_dump(*l.ptr); // default-warning {{404 S32b}} unlimited-warning {{404 S32b}} limit10-warning {{404 S32b}}
|
|
escape(l);
|
|
}
|
|
|
|
void theValueOfTheEscapedRegionRemainsTheSame() {
|
|
int *p = new int(404);
|
|
List l{p};
|
|
List l2{new int(42), {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24}, &l};
|
|
|
|
// The value of l.ptr shouldn't be clobbered after a failing to copy `&l`.
|
|
clang_analyzer_eval(p == l.ptr); // default-warning {{TRUE}} unlimited-warning {{TRUE}} limit10-warning {{TRUE}}
|
|
|
|
// If the bindings fit, we will know that it aliases with `p`. Otherwise, it's unknown. This is good.
|
|
clang_analyzer_dump(*l2.tail->ptr); // default-warning {{404 S32b}} unlimited-warning {{404 S32b}} limit10-warning {{Unknown}}
|
|
|
|
escape(l, l2);
|
|
}
|
|
|
|
void calleeWithManyParms(BigArray<int, 7> arr7, BigArray<int, 100> arr100) {
|
|
clang_analyzer_dump(arr7.array[0]); // default-warning {{0 S32b}} unlimited-warning {{0 S32b}} limit10-warning {{0 S32b}}
|
|
clang_analyzer_dump(arr7.array[6]); // default-warning {{6 S32b}} unlimited-warning {{6 S32b}} limit10-warning {{6 S32b}}
|
|
|
|
clang_analyzer_dump(arr100.array[0]); // default-warning {{10 S32b}} unlimited-warning {{10 S32b}} limit10-warning {{10 S32b}}
|
|
clang_analyzer_dump(arr100.array[6]); // default-warning {{16 S32b}} unlimited-warning {{16 S32b}} limit10-warning {{16 S32b}}
|
|
|
|
clang_analyzer_dump(arr100.array[8]); // default-warning {{18 S32b}} unlimited-warning {{18 S32b}} limit10-warning {{18 S32b}}
|
|
clang_analyzer_dump(arr100.array[9]); // default-warning {{19 S32b}} unlimited-warning {{19 S32b}} limit10-warning {{19 S32b}}
|
|
clang_analyzer_dump(arr100.array[10]); // default-warning {{20 S32b}} unlimited-warning {{20 S32b}} limit10-warning {{Unknown}}
|
|
clang_analyzer_dump(arr100.array[99]); // default-warning {{19 S32b}} unlimited-warning {{19 S32b}} limit10-warning {{Unknown}}
|
|
}
|
|
|
|
void tooManyFnArgumentsWhenInlining() {
|
|
calleeWithManyParms({0,1,2,3,4,5,6}, {
|
|
10,11,12,13,14,15,16,17,18,19,
|
|
20,21,22,23,24,25,26,27,28,29,
|
|
30,31,32,33,34,35,36,37,38,39,
|
|
40,41,42,43,44,45,46,47,48,49,
|
|
50,51,52,53,54,55,56,57,58,59,
|
|
60,61,62,63,64,65,66,67,68,69,
|
|
70,71,72,73,74,75,76,77,78,79,
|
|
80,81,82,83,84,85,86,87,88,89,
|
|
90,91,92,93,94,95,96,97,98,99,
|
|
10,11,12,13,14,15,16,17,18,19,
|
|
});
|
|
}
|
|
|
|
void gh129211_assertion() {
|
|
struct Clazz {
|
|
int b;
|
|
int : 0;
|
|
};
|
|
|
|
Clazz d[][5][5] = {
|
|
{
|
|
{{}, {}, {}, {}, {}},
|
|
{{}, {}, {}, {}, {}},
|
|
{{}, {}, {}, {}, {}},
|
|
{{}, {}, {}, {}, {}},
|
|
{{}, {}, {}, {}, {}}
|
|
},
|
|
{
|
|
{{}, {}, {}, {}, {}},
|
|
{{}, {}, {}, {}, {}},
|
|
{{}, {}, {}, {}, {}},
|
|
{{}, {}, {}, {}, {}},
|
|
{{}, {}, {}, {}, {}},
|
|
},
|
|
{
|
|
{{}, {}, {}, {}, {}},
|
|
{{}, {}, {}, {}, {}},
|
|
{{}, {}, {}, {}},
|
|
}
|
|
}; // no-crash
|
|
}
|