103 lines · c
1// RUN: %clang_analyze_cc1 -analyzer-checker=core,unix.Malloc -analyzer-max-loop 4 -verify %s2#include "Inputs/system-header-simulator.h"3 4typedef __typeof(sizeof(int)) size_t;5void *malloc(size_t);6 7static int another_function(int *y) {8 if (*y > 0)9 return *y;10 return 0;11}12 13static void function_which_doesnt_give_up(int **x) {14 *x = 0;15}16 17static void function_which_gives_up(int *x) {18 for (int i = 0; i < 5; ++i)19 (*x)++;20}21 22static void function_which_gives_up_nested(int *x) {23 function_which_gives_up(x);24 for (int i = 0; i < 5; ++i)25 (*x)++;26}27 28static void function_which_doesnt_give_up_nested(int *x, int *y) {29 *y = another_function(x);30 function_which_gives_up(x);31}32 33void coverage1(int *x) {34 function_which_gives_up(x);35 char *m = (char*)malloc(12);36} // expected-warning {{Potential leak of memory pointed to by 'm'}}37 38void coverage2(int *x) {39 if (x) {40 function_which_gives_up(x);41 char *m = (char*)malloc(12);42 }43} // expected-warning {{Potential leak of memory pointed to by 'm'}}44 45void coverage3(int *x) {46 x++;47 function_which_gives_up(x);48 char *m = (char*)malloc(12);49} // expected-warning {{Potential leak of memory pointed to by 'm'}}50 51void coverage4(int *x) {52 *x += another_function(x);53 function_which_gives_up(x);54 char *m = (char*)malloc(12);55} // expected-warning {{Potential leak of memory pointed to by 'm'}}56 57void coverage5(int *x) {58 for (int i = 0; i<7; ++i)59 function_which_gives_up(x);60 // The root function gives up here.61 char *m = (char*)malloc(12); // no-warning62}63 64void coverage6(int *x) {65 for (int i = 0; i<3; ++i) {66 function_which_gives_up(x);67 }68 char *m = (char*)malloc(12);69} // expected-warning {{Potential leak of memory pointed to by 'm'}}70 71int coverage7_inline(int *i) {72 function_which_doesnt_give_up(&i);73 return *i; // expected-warning {{Dereference}}74}75 76void coverage8(int *x) {77 int y;78 function_which_doesnt_give_up_nested(x, &y);79 y = (*x)/y; // expected-warning {{Division by zero}}80 char *m = (char*)malloc(12);81} // expected-warning {{Potential leak of memory pointed to by 'm'}}82 83void function_which_gives_up_settonull(int **x) {84 *x = 0;85 int y = 0;86 for (int i = 0; i < 5; ++i)87 y++;88}89 90void coverage9(int *x) {91 int y = 5;92 function_which_gives_up_settonull(&x);93 y = (*x); // no warning94}95 96static void empty_function(void){97}98int use_empty_function(int x) {99 x = 0;100 empty_function();101 return 5/x; //expected-warning {{Division by zero}}102}103