forked from OSchip/llvm-project
158 lines
5.6 KiB
C++
158 lines
5.6 KiB
C++
// RUN: %clang_analyze_cc1 -std=c++20 \
|
|
// RUN: -analyzer-checker=core,unix,cplusplus,debug.ExprInspection \
|
|
// RUN: -triple x86_64-unknown-linux-gnu \
|
|
// RUN: -verify %s
|
|
|
|
#include "Inputs/system-header-simulator-cxx.h"
|
|
|
|
typedef __SIZE_TYPE__ size_t;
|
|
void *malloc(size_t);
|
|
void *alloca(size_t);
|
|
void *realloc(void *ptr, size_t size);
|
|
void *calloc(size_t number, size_t size);
|
|
void free(void *);
|
|
|
|
struct S {
|
|
int f;
|
|
};
|
|
|
|
void clang_analyzer_dump(int);
|
|
void clang_analyzer_dump(const void *);
|
|
void clang_analyzer_dumpExtent(int);
|
|
void clang_analyzer_dumpExtent(const void *);
|
|
void clang_analyzer_dumpElementCount(int);
|
|
void clang_analyzer_dumpElementCount(const void *);
|
|
|
|
int clang_analyzer_getExtent(void *);
|
|
void clang_analyzer_eval(bool);
|
|
|
|
void var_simple_ref() {
|
|
int a = 13;
|
|
clang_analyzer_dump(&a); // expected-warning {{a}}
|
|
clang_analyzer_dumpExtent(&a); // expected-warning {{4 S64b}}
|
|
clang_analyzer_dumpElementCount(&a); // expected-warning {{1 S64b}}
|
|
}
|
|
|
|
void var_simple_ptr(int *a) {
|
|
clang_analyzer_dump(a); // expected-warning {{SymRegion{reg_$0<int * a>}}}
|
|
clang_analyzer_dumpExtent(a); // expected-warning {{extent_$1{SymRegion{reg_$0<int * a>}}}}
|
|
clang_analyzer_dumpElementCount(a); // expected-warning {{(extent_$1{SymRegion{reg_$0<int * a>}}) / 4}}
|
|
}
|
|
|
|
void var_array() {
|
|
int a[] = {1, 2, 3};
|
|
clang_analyzer_dump(a); // expected-warning {{Element{a,0 S64b,int}}}
|
|
clang_analyzer_dumpExtent(a); // expected-warning {{12 S64b}}
|
|
clang_analyzer_dumpElementCount(a); // expected-warning {{3 S64b}}
|
|
}
|
|
|
|
void string() {
|
|
clang_analyzer_dump("foo"); // expected-warning {{Element{"foo",0 S64b,char}}}
|
|
clang_analyzer_dumpExtent("foo"); // expected-warning {{4 S64b}}
|
|
clang_analyzer_dumpElementCount("foo"); // expected-warning {{4 S64b}}
|
|
}
|
|
|
|
void struct_simple_ptr(S *a) {
|
|
clang_analyzer_dump(a); // expected-warning {{SymRegion{reg_$0<struct S * a>}}}
|
|
clang_analyzer_dumpExtent(a); // expected-warning {{extent_$1{SymRegion{reg_$0<struct S * a>}}}}
|
|
clang_analyzer_dumpElementCount(a); // expected-warning {{(extent_$1{SymRegion{reg_$0<struct S * a>}}) / 4}}
|
|
}
|
|
|
|
void field_ref(S a) {
|
|
clang_analyzer_dump(&a.f); // expected-warning {{a.f}}
|
|
clang_analyzer_dumpExtent(&a.f); // expected-warning {{4 S64b}}
|
|
clang_analyzer_dumpElementCount(&a.f); // expected-warning {{1 S64b}}
|
|
}
|
|
|
|
void field_ptr(S *a) {
|
|
clang_analyzer_dump(&a->f); // expected-warning {{SymRegion{reg_$0<struct S * a>}.f}}
|
|
clang_analyzer_dumpExtent(&a->f); // expected-warning {{4 S64b}}
|
|
clang_analyzer_dumpElementCount(&a->f); // expected-warning {{1 S64b}}
|
|
}
|
|
|
|
void symbolic_array() {
|
|
int *a = new int[3];
|
|
clang_analyzer_dump(a); // expected-warning {{Element{HeapSymRegion{conj}}
|
|
clang_analyzer_dumpExtent(a); // expected-warning {{12 S64b}}
|
|
clang_analyzer_dumpElementCount(a); // expected-warning {{3 S64b}}
|
|
delete[] a;
|
|
}
|
|
|
|
void symbolic_placement_new() {
|
|
char *buf = new char[sizeof(int) * 3];
|
|
int *a = new (buf) int(12);
|
|
clang_analyzer_dump(a); // expected-warning {{Element{HeapSymRegion{conj}}
|
|
clang_analyzer_dumpExtent(a); // expected-warning {{12 S64b}}
|
|
clang_analyzer_dumpElementCount(a); // expected-warning {{3 S64b}}
|
|
delete[] buf;
|
|
}
|
|
|
|
void symbolic_malloc() {
|
|
int *a = (int *)malloc(12);
|
|
clang_analyzer_dump(a); // expected-warning {{Element{HeapSymRegion{conj}}
|
|
clang_analyzer_dumpExtent(a); // expected-warning {{12 U64b}}
|
|
clang_analyzer_dumpElementCount(a); // expected-warning {{3 S64b}}
|
|
free(a);
|
|
}
|
|
|
|
void symbolic_alloca() {
|
|
int *a = (int *)alloca(12);
|
|
clang_analyzer_dump(a); // expected-warning {{Element{HeapSymRegion{conj}}
|
|
clang_analyzer_dumpExtent(a); // expected-warning {{12 U64b}}
|
|
clang_analyzer_dumpElementCount(a); // expected-warning {{3 S64b}}
|
|
}
|
|
|
|
void symbolic_complex() {
|
|
int *a = (int *)malloc(4);
|
|
clang_analyzer_dumpExtent(a); // expected-warning {{4 U64b}}
|
|
clang_analyzer_dumpElementCount(a); // expected-warning {{1 S64b}}
|
|
|
|
int *b = (int *)realloc(a, sizeof(int) * 2);
|
|
clang_analyzer_dumpExtent(b); // expected-warning {{8 U64b}}
|
|
clang_analyzer_dumpElementCount(b); // expected-warning {{2 S64b}}
|
|
free(b);
|
|
|
|
int *c = (int *)calloc(3, 4);
|
|
clang_analyzer_dumpExtent(c); // expected-warning {{12 U64b}}
|
|
clang_analyzer_dumpElementCount(c); // expected-warning {{3 S64b}}
|
|
free(c);
|
|
}
|
|
|
|
void signedness_equality() {
|
|
char *a = new char[sizeof(char) * 13];
|
|
char *b = (char *)malloc(13);
|
|
|
|
clang_analyzer_dump(clang_analyzer_getExtent(a)); // expected-warning {{13 S64b}}
|
|
clang_analyzer_dump(clang_analyzer_getExtent(b)); // expected-warning {{13 U64b}}
|
|
clang_analyzer_eval(clang_analyzer_getExtent(a) ==
|
|
clang_analyzer_getExtent(b));
|
|
// expected-warning@-2 {{TRUE}}
|
|
|
|
delete[] a;
|
|
free(b);
|
|
}
|
|
|
|
void default_new_aligned() {
|
|
struct alignas(32) S {};
|
|
|
|
S *a = new S[10];
|
|
|
|
clang_analyzer_dump(a); // expected-warning {{Element{HeapSymRegion{conj}}
|
|
clang_analyzer_dumpExtent(a); // expected-warning {{320 S64b}}
|
|
clang_analyzer_dumpElementCount(a); // expected-warning {{10 S64b}}
|
|
|
|
delete[] a;
|
|
}
|
|
|
|
void *operator new[](std::size_t, std::align_val_t, bool hack) throw();
|
|
|
|
void user_defined_new() {
|
|
int *a = new (std::align_val_t(32), true) int[10];
|
|
|
|
clang_analyzer_dump(a); // expected-warning {{Element{SymRegion{conj}}
|
|
clang_analyzer_dumpExtent(a); // expected-warning-re {{{{^extent_\$[0-9]\{SymRegion{conj}}}}
|
|
clang_analyzer_dumpElementCount(a); // expected-warning-re {{{{^\(extent_\$[0-9]\{SymRegion{conj.*\) / 4}}}}
|
|
|
|
operator delete[](a, std::align_val_t(32));
|
|
}
|