forked from OSchip/llvm-project
				
			
		
			
				
	
	
		
			117 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			117 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C++
		
	
	
	
| // 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
 |