forked from OSchip/llvm-project
				
			
		
			
				
	
	
		
			142 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			142 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C
		
	
	
	
// RUN: %clang_cc1 -analyze -analyzer-checker=core -analyzer-config suppress-inlined-defensive-checks=true -verify %s
 | 
						|
 | 
						|
// Perform inline defensive checks.
 | 
						|
void idc(int *p) {
 | 
						|
	if (p)
 | 
						|
		;
 | 
						|
}
 | 
						|
 | 
						|
int test01(int *p) {
 | 
						|
  if (p)
 | 
						|
    ;
 | 
						|
  return *p; // expected-warning {{Dereference of null pointer}}
 | 
						|
}
 | 
						|
 | 
						|
int test02(int *p, int *x) {
 | 
						|
  if (p)
 | 
						|
    ;
 | 
						|
  idc(p);
 | 
						|
	if (x)
 | 
						|
		;
 | 
						|
  return *p; // expected-warning {{Dereference of null pointer}}
 | 
						|
}
 | 
						|
 | 
						|
int test03(int *p, int *x) {
 | 
						|
	idc(p);
 | 
						|
	if (p)
 | 
						|
		;
 | 
						|
	return *p; // False negative
 | 
						|
}
 | 
						|
 | 
						|
int deref04(int *p) {
 | 
						|
  return *p; // expected-warning {{Dereference of null pointer}}
 | 
						|
}
 | 
						|
 | 
						|
int test04(int *p) {
 | 
						|
  if (p)
 | 
						|
    ;
 | 
						|
  idc(p);
 | 
						|
  return deref04(p);
 | 
						|
}
 | 
						|
 | 
						|
int test11(int *q, int *x) {
 | 
						|
	int *p = q;
 | 
						|
	if (q)
 | 
						|
		;
 | 
						|
	if (x)
 | 
						|
		;
 | 
						|
	return *p; // expected-warning{{Dereference of null pointer}}
 | 
						|
}
 | 
						|
 | 
						|
int test12(int *q) {
 | 
						|
	int *p = q;
 | 
						|
	idc(q);
 | 
						|
	return *p;
 | 
						|
}
 | 
						|
 | 
						|
int test13(int *q) {
 | 
						|
	int *p = q;
 | 
						|
	idc(p);
 | 
						|
	return *p;
 | 
						|
}
 | 
						|
 | 
						|
int test21(int *q, int *x) {
 | 
						|
	if (q)
 | 
						|
		;
 | 
						|
	if (x)
 | 
						|
		;
 | 
						|
	int *p = q;
 | 
						|
	return *p; // expected-warning{{Dereference of null pointer}}
 | 
						|
}
 | 
						|
 | 
						|
int test22(int *q, int *x) {
 | 
						|
  idc(q);
 | 
						|
	if (x)
 | 
						|
		;
 | 
						|
	int *p = q;
 | 
						|
	return *p;
 | 
						|
}
 | 
						|
 | 
						|
int test23(int *q, int *x) {
 | 
						|
  idc(q);
 | 
						|
	if (x)
 | 
						|
		;
 | 
						|
	int *p = q;
 | 
						|
  if (!p)
 | 
						|
    ;
 | 
						|
	return *p; // False negative
 | 
						|
}
 | 
						|
 | 
						|
void use(char *p) {
 | 
						|
  if (!p)
 | 
						|
    return;
 | 
						|
  p[0] = 'a';
 | 
						|
}
 | 
						|
 | 
						|
void test24(char *buffer) {
 | 
						|
  use(buffer);
 | 
						|
  buffer[1] = 'b';
 | 
						|
}
 | 
						|
 | 
						|
// Ensure idc works on pointers with constant offset.
 | 
						|
void idcchar(const char *s2) {
 | 
						|
  if(s2)
 | 
						|
    ;
 | 
						|
}
 | 
						|
void testConstantOffset(char *value) {
 | 
						|
  char *cursor = value + 5;
 | 
						|
  idcchar(cursor);
 | 
						|
  if (*cursor) {
 | 
						|
    cursor++;
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
// Ensure idc works for integer zero values (ex: suppressed div by zero).
 | 
						|
void idcZero(int assume) {
 | 
						|
  if (assume)
 | 
						|
    ;
 | 
						|
}
 | 
						|
 | 
						|
int idcTriggerZeroValue(int m) {
 | 
						|
  idcZero(m);
 | 
						|
  return 5/m; // no-warning
 | 
						|
}
 | 
						|
 | 
						|
int idcTriggerZeroValueThroughCall(int i) {
 | 
						|
  return 5/i; // no-warning
 | 
						|
}
 | 
						|
void idcTrackZeroValueThroughCall(int x) {
 | 
						|
  idcZero(x);
 | 
						|
  idcTriggerZeroValueThroughCall(x);
 | 
						|
}
 | 
						|
 | 
						|
int idcTriggerZeroThroughDoubleAssignemnt(int i) {
 | 
						|
  return 5/i; // no-warning
 | 
						|
}
 | 
						|
void idcTrackZeroThroughDoubleAssignemnt(int x) {
 | 
						|
  idcZero(x);
 | 
						|
  int y = x;
 | 
						|
  int z = y;
 | 
						|
  idcTriggerZeroValueThroughCall(z);
 | 
						|
}
 |