Mercurial > hg > CbC > CbC_llvm
view clang/test/Analysis/ctor-array.cpp @ 236:c4bab56944e8 llvm-original
LLVM 16
author | kono |
---|---|
date | Wed, 09 Nov 2022 17:45:10 +0900 |
parents | |
children |
line wrap: on
line source
// RUN: %clang_analyze_cc1 -analyzer-checker=core,debug.ExprInspection -analyzer-disable-checker=cplusplus -analyzer-config c++-inlining=constructors -verify %s #include "Inputs/system-header-simulator-cxx.h" void clang_analyzer_eval(bool); struct s { int x; int y; }; void a1(void) { s arr[3]; int x = arr[0].x; // expected-warning@-1{{Assigned value is garbage or undefined}} } void a2(void) { s arr[3]; int x = arr[1].x; // expected-warning@-1{{Assigned value is garbage or undefined}} } void a3(void) { s arr[3]; int x = arr[2].x; // expected-warning@-1{{Assigned value is garbage or undefined}} } struct s2 { int x; int y = 2; }; void b1(void) { s2 arr[3]; clang_analyzer_eval(arr[0].y == 2); // expected-warning{{TRUE}} int x = arr[0].x; // expected-warning@-1{{Assigned value is garbage or undefined}} } void b2(void) { s2 arr[3]; clang_analyzer_eval(arr[1].y == 2); // expected-warning{{TRUE}} int x = arr[1].x; // expected-warning@-1{{Assigned value is garbage or undefined}} } void b3(void) { s2 arr[3]; clang_analyzer_eval(arr[2].y == 2); // expected-warning{{TRUE}} int x = arr[2].x; // expected-warning@-1{{Assigned value is garbage or undefined}} } void c1(void) { { s2 arr[2]; arr[1].x = 3; clang_analyzer_eval(arr[1].y == 2); // expected-warning{{TRUE}} clang_analyzer_eval(arr[1].x == 3); // expected-warning{{TRUE}} } { s2 arr[2]; clang_analyzer_eval(arr[1].y == 2); // expected-warning{{TRUE}} int x = arr[1].x; // expected-warning@-1{{Assigned value is garbage or undefined}} } } struct s3 { int x = 1; int y = 2; }; struct s4 { s3 arr[2]; s sarr[2]; }; void e1(void) { s4 arr[2]; clang_analyzer_eval(arr[0].arr[0].x == 1); // expected-warning{{TRUE}} clang_analyzer_eval(arr[0].arr[0].y == 2); // expected-warning{{TRUE}} clang_analyzer_eval(arr[0].arr[1].x == 1); // expected-warning{{TRUE}} clang_analyzer_eval(arr[0].arr[1].y == 2); // expected-warning{{TRUE}} clang_analyzer_eval(arr[1].arr[0].x == 1); // expected-warning{{TRUE}} clang_analyzer_eval(arr[1].arr[0].y == 2); // expected-warning{{TRUE}} clang_analyzer_eval(arr[1].arr[1].x == 1); // expected-warning{{TRUE}} clang_analyzer_eval(arr[1].arr[1].y == 2); // expected-warning{{TRUE}} int x = arr[1].sarr[1].x; // expected-warning@-1{{Assigned value is garbage or undefined}} } void f1(void) { s2 arr[2][2]; clang_analyzer_eval(arr[1][1].y == 2); // expected-warning{{TRUE}} int x = arr[1][1].x; // expected-warning@-1{{Assigned value is garbage or undefined}} } struct s5 { static int c; int x; s5() : x(c++) {} }; void g1(void) { // FIXME: This test requires -analyzer-disable-checker=cplusplus, // because of the checker's weird behaviour in case of arrays. // E.g.: // s3 *arr = new s3[4]; // s3 *arr2 = new (arr + 1) s3[1]; // ^~~~~~~~~~~~~~~~~~~ // warning: 12 bytes is possibly not enough // for array allocation which requires // 4 bytes. s5::c = 0; s5 *arr = new s5[4]; new (arr + 1) s5[3]; clang_analyzer_eval(arr[0].x == 0); // expected-warning{{TRUE}} clang_analyzer_eval(arr[1].x == 4); // expected-warning{{TRUE}} clang_analyzer_eval(arr[2].x == 5); // expected-warning{{TRUE}} clang_analyzer_eval(arr[3].x == 6); // expected-warning{{TRUE}} } void g2(void) { s5::c = 0; s5 arr[4]; clang_analyzer_eval(arr[0].x == 0); // expected-warning{{TRUE}} clang_analyzer_eval(arr[1].x == 1); // expected-warning{{TRUE}} clang_analyzer_eval(arr[2].x == 2); // expected-warning{{TRUE}} clang_analyzer_eval(arr[3].x == 3); // expected-warning{{TRUE}} } void g3(void) { s5::c = 0; s5 arr[2][2]; clang_analyzer_eval(arr[0][0].x == 0); // expected-warning{{TRUE}} clang_analyzer_eval(arr[0][1].x == 1); // expected-warning{{TRUE}} clang_analyzer_eval(arr[1][0].x == 2); // expected-warning{{TRUE}} clang_analyzer_eval(arr[1][1].x == 3); // expected-warning{{TRUE}} } void h1(void) { s5::c = 0; s5 a[2][2], b[2][2]; clang_analyzer_eval(a[0][0].x == 0); // expected-warning{{TRUE}} clang_analyzer_eval(a[0][1].x == 1); // expected-warning{{TRUE}} clang_analyzer_eval(a[1][0].x == 2); // expected-warning{{TRUE}} clang_analyzer_eval(a[1][1].x == 3); // expected-warning{{TRUE}} clang_analyzer_eval(b[0][0].x == 4); // expected-warning{{TRUE}} clang_analyzer_eval(b[0][1].x == 5); // expected-warning{{TRUE}} clang_analyzer_eval(b[1][0].x == 6); // expected-warning{{TRUE}} clang_analyzer_eval(b[1][1].x == 7); // expected-warning{{TRUE}} } void h2(void) { s a[2][2], b[2][2]; int x = a[1][1].x; // expected-warning@-1{{Assigned value is garbage or undefined}} } void h3(void) { s a[2][2], b[2][2]; int x = b[1][1].y; // expected-warning@-1{{Assigned value is garbage or undefined}} } struct Base { int x; int y; Base(int x, int y) : x(x), y(y) {} }; struct Derived : public Base { int i; int j; Derived(int x, int y, int i, int j) : Base(x, y), i(i), j(j) {} }; void delegate(void) { Derived arr[2] = {{1, 2, 3, 4}, {5, 6, 7, 8}}; clang_analyzer_eval(arr[0].x == 1); // expected-warning{{TRUE}} clang_analyzer_eval(arr[0].y == 2); // expected-warning{{TRUE}} clang_analyzer_eval(arr[0].i == 3); // expected-warning{{TRUE}} clang_analyzer_eval(arr[0].j == 4); // expected-warning{{TRUE}} clang_analyzer_eval(arr[1].x == 5); // expected-warning{{TRUE}} clang_analyzer_eval(arr[1].y == 6); // expected-warning{{TRUE}} clang_analyzer_eval(arr[1].i == 7); // expected-warning{{TRUE}} clang_analyzer_eval(arr[1].j == 8); // expected-warning{{TRUE}} } void delegate_heap(void) { Derived *arr = new Derived[2]{{1, 2, 3, 4}, {5, 6, 7, 8}}; clang_analyzer_eval(arr[0].x == 1); // expected-warning{{TRUE}} clang_analyzer_eval(arr[0].y == 2); // expected-warning{{TRUE}} clang_analyzer_eval(arr[0].i == 3); // expected-warning{{TRUE}} clang_analyzer_eval(arr[0].j == 4); // expected-warning{{TRUE}} clang_analyzer_eval(arr[1].x == 5); // expected-warning{{TRUE}} clang_analyzer_eval(arr[1].y == 6); // expected-warning{{TRUE}} clang_analyzer_eval(arr[1].i == 7); // expected-warning{{TRUE}} clang_analyzer_eval(arr[1].j == 8); // expected-warning{{TRUE}} } struct Member { int x; int y; }; struct Parent { Member arr[2]; Parent() : arr{{1, 2}, {3, 4}} {} }; void member() { Parent arr[2]; // FIXME: Ideally these are TRUE, but at the moment InitListExpr has no // knowledge about where the initializer list is used, so we can't bind // the initializer list to the required region. clang_analyzer_eval(arr[0].arr[0].x == 1); // expected-warning{{UNKNOWN}} clang_analyzer_eval(arr[0].arr[0].y == 2); // expected-warning{{UNKNOWN}} clang_analyzer_eval(arr[0].arr[1].x == 3); // expected-warning{{UNKNOWN}} clang_analyzer_eval(arr[0].arr[1].y == 4); // expected-warning{{UNKNOWN}} clang_analyzer_eval(arr[1].arr[0].x == 1); // expected-warning{{UNKNOWN}} clang_analyzer_eval(arr[1].arr[0].y == 2); // expected-warning{{UNKNOWN}} clang_analyzer_eval(arr[1].arr[1].x == 3); // expected-warning{{UNKNOWN}} clang_analyzer_eval(arr[1].arr[1].y == 4); // expected-warning{{UNKNOWN}} }