You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
117 lines
2.3 KiB
117 lines
2.3 KiB
// RUN: %clang_analyze_cc1 -std=c++14 -analyzer-checker=core,debug.ExprInspection -analyzer-store=region -verify %s
|
|
|
|
void clang_analyzer_eval(bool);
|
|
|
|
bool PR14634(int x) {
|
|
double y = (double)x;
|
|
return !y;
|
|
}
|
|
|
|
bool PR14634_implicit(int x) {
|
|
double y = (double)x;
|
|
return y;
|
|
}
|
|
|
|
void intAsBoolAsSwitchCondition(int c) {
|
|
switch ((bool)c) { // expected-warning {{switch condition has boolean value}}
|
|
case 0:
|
|
break;
|
|
}
|
|
|
|
switch ((int)(bool)c) { // no-warning
|
|
case 0:
|
|
break;
|
|
}
|
|
}
|
|
|
|
int *&castToIntPtrLValueRef(char *p) {
|
|
return (int *&)*(int *)p;
|
|
}
|
|
bool testCastToIntPtrLValueRef(char *p, int *s) {
|
|
return castToIntPtrLValueRef(p) != s; // no-crash
|
|
}
|
|
|
|
int *&&castToIntPtrRValueRef(char *p) {
|
|
return (int *&&)*(int *)p;
|
|
}
|
|
bool testCastToIntPtrRValueRef(char *p, int *s) {
|
|
return castToIntPtrRValueRef(p) != s; // no-crash
|
|
}
|
|
|
|
bool retrievePointerFromBoolean(int *p) {
|
|
bool q;
|
|
*reinterpret_cast<int **>(&q) = p;
|
|
return q;
|
|
}
|
|
|
|
namespace base_to_derived {
|
|
struct A {};
|
|
struct B : public A{};
|
|
|
|
void foo(A* a) {
|
|
B* b = (B* ) a;
|
|
A* a2 = (A *) b;
|
|
clang_analyzer_eval(a2 == a); // expected-warning{{TRUE}}
|
|
}
|
|
}
|
|
|
|
namespace base_to_derived_double_inheritance {
|
|
struct A {
|
|
int x;
|
|
};
|
|
struct B {
|
|
int y;
|
|
};
|
|
struct C : A, B {};
|
|
|
|
void foo(B *b) {
|
|
C *c = (C *)b;
|
|
b->y = 1;
|
|
clang_analyzer_eval(c->x); // expected-warning{{UNKNOWN}}
|
|
clang_analyzer_eval(c->y); // expected-warning{{TRUE}}
|
|
}
|
|
} // namespace base_to_derived_double_inheritance
|
|
|
|
namespace base_to_derived_opaque_class {
|
|
class NotInt {
|
|
public:
|
|
operator int() { return !x; } // no-crash
|
|
int x;
|
|
};
|
|
|
|
typedef struct Opaque *OpaqueRef;
|
|
typedef void *VeryOpaqueRef;
|
|
|
|
class Transparent {
|
|
public:
|
|
int getNotInt() { return NI; }
|
|
NotInt NI;
|
|
};
|
|
|
|
class SubTransparent : public Transparent {};
|
|
|
|
SubTransparent *castToDerived(Transparent *TRef) {
|
|
return (SubTransparent *)TRef;
|
|
}
|
|
|
|
void foo(OpaqueRef ORef) {
|
|
castToDerived(reinterpret_cast<Transparent *>(ORef))->getNotInt();
|
|
}
|
|
|
|
void foo(VeryOpaqueRef ORef) {
|
|
castToDerived(reinterpret_cast<Transparent *>(ORef))->getNotInt();
|
|
}
|
|
} // namespace base_to_derived_opaque_class
|
|
|
|
namespace bool_to_nullptr {
|
|
struct S {
|
|
int *a[1];
|
|
bool b;
|
|
};
|
|
void foo(S s) {
|
|
s.b = true;
|
|
for (int i = 0; i < 2; ++i)
|
|
(void)(s.a[i] != nullptr); // no-crash
|
|
}
|
|
} // namespace bool_to_nullptr
|