102 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			102 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			C
		
	
	
	
// RUN: %clang_analyze_cc1                                         \
 | 
						|
// RUN:  -analyzer-checker=core,alpha.security.cert.env.InvalidPtr \
 | 
						|
// RUN:  -verify -Wno-unused %s
 | 
						|
 | 
						|
#include "../Inputs/system-header-simulator.h"
 | 
						|
char *getenv(const char *name);
 | 
						|
int strcmp(const char*, const char*);
 | 
						|
char *strdup(const char*);
 | 
						|
void free(void *memblock);
 | 
						|
void *malloc(size_t size);
 | 
						|
 | 
						|
void incorrect_usage(void) {
 | 
						|
  char *tmpvar;
 | 
						|
  char *tempvar;
 | 
						|
 | 
						|
  tmpvar = getenv("TMP");
 | 
						|
 | 
						|
  if (!tmpvar)
 | 
						|
    return;
 | 
						|
 | 
						|
  tempvar = getenv("TEMP");
 | 
						|
 | 
						|
  if (!tempvar)
 | 
						|
    return;
 | 
						|
 | 
						|
  if (strcmp(tmpvar, tempvar) == 0) { // body of strcmp is unknown
 | 
						|
    // expected-warning@-1{{use of invalidated pointer 'tmpvar' in a function call}}
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
void correct_usage_1(void) {
 | 
						|
  char *tmpvar;
 | 
						|
  char *tempvar;
 | 
						|
 | 
						|
  const char *temp = getenv("TMP");
 | 
						|
  if (temp != NULL) {
 | 
						|
    tmpvar = (char *)malloc(strlen(temp)+1);
 | 
						|
    if (tmpvar != NULL) {
 | 
						|
      strcpy(tmpvar, temp);
 | 
						|
    } else {
 | 
						|
      return;
 | 
						|
    }
 | 
						|
  } else {
 | 
						|
    return;
 | 
						|
  }
 | 
						|
 | 
						|
  temp = getenv("TEMP");
 | 
						|
  if (temp != NULL) {
 | 
						|
    tempvar = (char *)malloc(strlen(temp)+1);
 | 
						|
    if (tempvar != NULL) {
 | 
						|
      strcpy(tempvar, temp);
 | 
						|
    } else {
 | 
						|
      return;
 | 
						|
    }
 | 
						|
  } else {
 | 
						|
    return;
 | 
						|
  }
 | 
						|
 | 
						|
  if (strcmp(tmpvar, tempvar) == 0) {
 | 
						|
    printf("TMP and TEMP are the same.\n");
 | 
						|
  } else {
 | 
						|
    printf("TMP and TEMP are NOT the same.\n");
 | 
						|
  }
 | 
						|
  free(tmpvar);
 | 
						|
  free(tempvar);
 | 
						|
}
 | 
						|
 | 
						|
void correct_usage_2(void) {
 | 
						|
  char *tmpvar;
 | 
						|
  char *tempvar;
 | 
						|
 | 
						|
  const char *temp = getenv("TMP");
 | 
						|
  if (temp != NULL) {
 | 
						|
    tmpvar = strdup(temp);
 | 
						|
    if (tmpvar == NULL) {
 | 
						|
      return;
 | 
						|
    }
 | 
						|
  } else {
 | 
						|
    return;
 | 
						|
  }
 | 
						|
 | 
						|
  temp = getenv("TEMP");
 | 
						|
  if (temp != NULL) {
 | 
						|
    tempvar = strdup(temp);
 | 
						|
    if (tempvar == NULL) {
 | 
						|
      return;
 | 
						|
    }
 | 
						|
  } else {
 | 
						|
    return;
 | 
						|
  }
 | 
						|
 | 
						|
  if (strcmp(tmpvar, tempvar) == 0) {
 | 
						|
    printf("TMP and TEMP are the same.\n");
 | 
						|
  } else {
 | 
						|
    printf("TMP and TEMP are NOT the same.\n");
 | 
						|
  }
 | 
						|
  free(tmpvar);
 | 
						|
  tmpvar = NULL;
 | 
						|
  free(tempvar);
 | 
						|
  tempvar = NULL;
 | 
						|
}
 |