New check: Check for unused return values (#653)

This commit is contained in:
PKEuS 2014-09-27 21:31:04 +02:00
parent b0c34390cd
commit 210294443e
6 changed files with 167 additions and 59 deletions

View File

@ -1,40 +1,42 @@
<?xml version="1.0"?>
<def>
<function name="abort"><noreturn>true</noreturn></function>
<function name="abs"><pure/><noreturn>false</noreturn><leak-ignore/><arg nr="1"><not-uninit/><not-bool/></arg></function>
<function name="acos"><pure/><noreturn>false</noreturn><leak-ignore/><arg nr="1"><not-uninit/></arg></function>
<function name="abs"><use-retval/><pure/><noreturn>false</noreturn><leak-ignore/><arg nr="1"><not-uninit/><not-bool/></arg></function>
<function name="acos"><use-retval/><pure/><noreturn>false</noreturn><leak-ignore/><arg nr="1"><not-uninit/></arg></function>
<function name="asctime">
<noreturn>false</noreturn>
<leak-ignore/>
<arg nr="1"><not-uninit/></arg>
<use-retval/>
<noreturn>false</noreturn>
<leak-ignore/>
<arg nr="1"><not-uninit/></arg>
</function>
<function name="assert">
<leak-ignore/>
</function>
<function name="asin"><pure/><noreturn>false</noreturn><leak-ignore/><arg nr="1"><not-uninit/></arg></function>
<function name="atan"><pure/><noreturn>false</noreturn><leak-ignore/><arg nr="1"><not-uninit/></arg></function>
<function name="atan2"><pure/><noreturn>false</noreturn><leak-ignore/><arg nr="1"><not-uninit/></arg><arg nr="2"><not-uninit/></arg></function>
<function name="asin"><use-retval/><pure/><noreturn>false</noreturn><leak-ignore/><arg nr="1"><not-uninit/></arg></function>
<function name="atan"><use-retval/><pure/><noreturn>false</noreturn><leak-ignore/><arg nr="1"><not-uninit/></arg></function>
<function name="atan2"><use-retval/><pure/><noreturn>false</noreturn><leak-ignore/><arg nr="1"><not-uninit/></arg><arg nr="2"><not-uninit/></arg></function>
<function name="atexit"><pure/><noreturn>false</noreturn><leak-ignore/><arg nr="1"><not-null/></arg></function>
<function name="atof"><pure/><noreturn>false</noreturn><leak-ignore/><arg nr="1"><not-uninit/></arg></function>
<function name="atoi"><pure/><noreturn>false</noreturn><leak-ignore/><arg nr="1"><not-uninit/></arg></function>
<function name="atol"><pure/><noreturn>false</noreturn><leak-ignore/><arg nr="1"><not-uninit/></arg></function>
<function name="atoll"><pure/><noreturn>false</noreturn><leak-ignore/><arg nr="1"><not-uninit/></arg></function>
<function name="calloc"><noreturn>false</noreturn><arg nr="1"><not-uninit/></arg><arg nr="2"><not-uninit/></arg></function>
<function name="ceil"><pure/><noreturn>false</noreturn><leak-ignore/><arg nr="1"><not-uninit/></arg></function>
<function name="atof"><use-retval/><pure/><noreturn>false</noreturn><leak-ignore/><arg nr="1"><not-uninit/></arg></function>
<function name="atoi"><use-retval/><pure/><noreturn>false</noreturn><leak-ignore/><arg nr="1"><not-uninit/></arg></function>
<function name="atol"><use-retval/><pure/><noreturn>false</noreturn><leak-ignore/><arg nr="1"><not-uninit/></arg></function>
<function name="atoll"><use-retval/><pure/><noreturn>false</noreturn><leak-ignore/><arg nr="1"><not-uninit/></arg></function>
<function name="calloc"><use-retval/><noreturn>false</noreturn><arg nr="1"><not-uninit/></arg><arg nr="2"><not-uninit/></arg></function>
<function name="ceil"><use-retval/><pure/><noreturn>false</noreturn><leak-ignore/><arg nr="1"><not-uninit/></arg></function>
<function name="clearerr">
<noreturn>false</noreturn>
<leak-ignore/>
<arg nr="1"><not-null/><not-uninit/></arg>
</function>
<function name="clock"><noreturn>false</noreturn><leak-ignore/></function>
<function name="cos"><pure/><noreturn>false</noreturn><leak-ignore/><arg nr="1"><not-uninit/></arg></function>
<function name="cosh"><pure/><noreturn>false</noreturn><leak-ignore/><arg nr="1"><not-uninit/></arg></function>
<function name="cos"><use-retval/><pure/><noreturn>false</noreturn><leak-ignore/><arg nr="1"><not-uninit/></arg></function>
<function name="cosh"><use-retval/><pure/><noreturn>false</noreturn><leak-ignore/><arg nr="1"><not-uninit/></arg></function>
<function name="ctime">
<use-retval/>
<noreturn>false</noreturn>
<leak-ignore/>
<arg nr="1"><not-uninit/></arg>
</function>
<function name="difftime"><noreturn>false</noreturn><leak-ignore/><arg nr="1"><not-uninit/></arg><arg nr="2"><not-uninit/></arg></function>
<function name="difftime"><use-retval/><noreturn>false</noreturn><leak-ignore/><arg nr="1"><not-uninit/></arg><arg nr="2"><not-uninit/></arg></function>
<function name="div">
<pure/>
<noreturn>false</noreturn>
@ -43,18 +45,20 @@
<arg nr="2"><not-uninit/></arg>
</function>
<function name="exit"><noreturn>true</noreturn><arg nr="1"><not-uninit/></arg></function>
<function name="exp"><pure/><noreturn>false</noreturn><leak-ignore/><arg nr="1"><not-uninit/></arg></function>
<function name="fabs"><pure/><noreturn>false</noreturn><leak-ignore/><arg nr="1"><not-uninit/></arg></function>
<function name="exp"><use-retval/><pure/><noreturn>false</noreturn><leak-ignore/><arg nr="1"><not-uninit/></arg></function>
<function name="fabs"><use-retval/><pure/><noreturn>false</noreturn><leak-ignore/><arg nr="1"><not-uninit/></arg></function>
<function name="fclose">
<noreturn>false</noreturn>
<arg nr="1"><not-null/><not-uninit/></arg>
</function>
<function name="feof">
<use-retval/>
<noreturn>false</noreturn>
<leak-ignore/>
<arg nr="1"><not-null/><not-uninit/></arg>
</function>
<function name="ferror">
<use-retval/>
<noreturn>false</noreturn>
<leak-ignore/>
<arg nr="1"><not-null/><not-uninit/></arg>
@ -79,9 +83,10 @@
<arg nr="1"><not-null/><not-uninit/></arg>
<arg nr="2"><not-null/><not-uninit/></arg>
</function>
<function name="floor"><pure/><noreturn>false</noreturn><leak-ignore/><arg nr="1"><not-uninit/></arg></function>
<function name="fmod"><pure/><noreturn>false</noreturn><leak-ignore/><arg nr="1"><not-uninit/></arg><arg nr="2"><not-uninit/></arg></function>
<function name="floor"><use-retval/><pure/><noreturn>false</noreturn><leak-ignore/><arg nr="1"><not-uninit/></arg></function>
<function name="fmod"><use-retval/><pure/><noreturn>false</noreturn><leak-ignore/><arg nr="1"><not-uninit/></arg><arg nr="2"><not-uninit/></arg></function>
<function name="fopen">
<use-retval/>
<noreturn>false</noreturn>
<arg nr="1"><not-null/><not-uninit/></arg>
<arg nr="2"><not-null/><not-uninit/></arg>
@ -201,6 +206,7 @@
<arg nr="4"><not-null/><not-uninit/></arg>
</function>
<function name="mblen">
<use-retval/>
<noreturn>false</noreturn>
<leak-ignore/>
<arg nr="1"><not-uninit/></arg>
@ -251,32 +257,34 @@
<arg nr="1"><not-uninit/></arg>
<arg nr="1"><not-null/><not-uninit/></arg>
</function>
<function name="getenv"><noreturn>false</noreturn><leak-ignore/><arg nr="1"><not-null/><not-uninit/></arg></function>
<function name="getenv"><use-retval/><noreturn>false</noreturn><leak-ignore/><arg nr="1"><not-null/><not-uninit/></arg></function>
<function name="gets">
<noreturn>false</noreturn>
<leak-ignore/>
<arg nr="1"><not-null/></arg>
</function>
<function name="gmtime">
<use-retval/>
<noreturn>false</noreturn>
<leak-ignore/>
<arg nr="1"><not-null/><not-uninit/></arg>
</function>
<function name="isalnum"> <pure/><noreturn>false</noreturn> <leak-ignore/> <arg nr="1"><valid>0:255</valid></arg> </function>
<function name="isalpha"> <pure/><noreturn>false</noreturn> <leak-ignore/> <arg nr="1"><valid>0:255</valid></arg> </function>
<function name="isblank"> <pure/><noreturn>false</noreturn> <leak-ignore/> <arg nr="1"><valid>0:255</valid></arg> </function>
<function name="iscntrl"> <pure/><noreturn>false</noreturn> <leak-ignore/> <arg nr="1"><valid>0:255</valid></arg> </function>
<function name="isdigit"> <pure/><noreturn>false</noreturn> <leak-ignore/> <arg nr="1"><valid>0:255</valid></arg> </function>
<function name="isgraph"> <pure/><noreturn>false</noreturn> <leak-ignore/> <arg nr="1"><valid>0:255</valid></arg> </function>
<function name="islower"> <pure/><noreturn>false</noreturn> <leak-ignore/> <arg nr="1"><valid>0:255</valid></arg> </function>
<function name="isprint"> <pure/><noreturn>false</noreturn> <leak-ignore/> <arg nr="1"><valid>0:255</valid></arg> </function>
<function name="ispunct"> <pure/><noreturn>false</noreturn> <leak-ignore/> <arg nr="1"><valid>0:255</valid></arg> </function>
<function name="isspace"> <pure/><noreturn>false</noreturn> <leak-ignore/> <arg nr="1"><valid>0:255</valid></arg> </function>
<function name="isupper"> <pure/><noreturn>false</noreturn> <leak-ignore/> <arg nr="1"><valid>0:255</valid></arg> </function>
<function name="isxdigit"><pure/><noreturn>false</noreturn> <leak-ignore/> <arg nr="1"><valid>0:255</valid></arg> </function>
<function name="labs"> <pure/><noreturn>false</noreturn><leak-ignore/> <arg nr="1"><not-uninit/></arg></function>
<function name="llabs"> <pure/><noreturn>false</noreturn><leak-ignore/> <arg nr="1"><not-uninit/></arg></function>
<function name="isalnum"> <use-retval/><pure/><noreturn>false</noreturn> <leak-ignore/> <arg nr="1"><valid>0:255</valid></arg> </function>
<function name="isalpha"> <use-retval/><pure/><noreturn>false</noreturn> <leak-ignore/> <arg nr="1"><valid>0:255</valid></arg> </function>
<function name="isblank"> <use-retval/><pure/><noreturn>false</noreturn> <leak-ignore/> <arg nr="1"><valid>0:255</valid></arg> </function>
<function name="iscntrl"> <use-retval/><pure/><noreturn>false</noreturn> <leak-ignore/> <arg nr="1"><valid>0:255</valid></arg> </function>
<function name="isdigit"> <use-retval/><pure/><noreturn>false</noreturn> <leak-ignore/> <arg nr="1"><valid>0:255</valid></arg> </function>
<function name="isgraph"> <use-retval/><pure/><noreturn>false</noreturn> <leak-ignore/> <arg nr="1"><valid>0:255</valid></arg> </function>
<function name="islower"> <use-retval/><pure/><noreturn>false</noreturn> <leak-ignore/> <arg nr="1"><valid>0:255</valid></arg> </function>
<function name="isprint"> <use-retval/><pure/><noreturn>false</noreturn> <leak-ignore/> <arg nr="1"><valid>0:255</valid></arg> </function>
<function name="ispunct"> <use-retval/><pure/><noreturn>false</noreturn> <leak-ignore/> <arg nr="1"><valid>0:255</valid></arg> </function>
<function name="isspace"> <use-retval/><pure/><noreturn>false</noreturn> <leak-ignore/> <arg nr="1"><valid>0:255</valid></arg> </function>
<function name="isupper"> <use-retval/><pure/><noreturn>false</noreturn> <leak-ignore/> <arg nr="1"><valid>0:255</valid></arg> </function>
<function name="isxdigit"><use-retval/><pure/><noreturn>false</noreturn> <leak-ignore/> <arg nr="1"><valid>0:255</valid></arg> </function>
<function name="labs"> <use-retval/><pure/><noreturn>false</noreturn><leak-ignore/> <arg nr="1"><not-uninit/></arg></function>
<function name="llabs"> <use-retval/><pure/><noreturn>false</noreturn><leak-ignore/> <arg nr="1"><not-uninit/></arg></function>
<function name="ldexp">
<use-retval/>
<pure/>
<noreturn>false</noreturn>
<leak-ignore/>
@ -284,6 +292,7 @@
<arg nr="2"><not-uninit/></arg>
</function>
<function name="rand">
<use-retval/>
<noreturn>false</noreturn>
<leak-ignore/>
</function>
@ -311,17 +320,18 @@
<leak-ignore/>
<arg nr="1"><not-uninit/></arg>
</function>
<function name="log"><noreturn>false</noreturn><leak-ignore/><arg nr="1"><not-uninit/></arg></function>
<function name="log10"><noreturn>false</noreturn><leak-ignore/><arg nr="1"><not-uninit/></arg></function>
<function name="log"><use-retval/><noreturn>false</noreturn><leak-ignore/><arg nr="1"><not-uninit/></arg></function>
<function name="log10"><use-retval/><noreturn>false</noreturn><leak-ignore/><arg nr="1"><not-uninit/></arg></function>
<function name="longjmp">
<noreturn>false</noreturn>
<leak-ignore/>
<arg nr="1"><not-uninit/></arg>
<arg nr="2"><not-uninit/></arg>
</function>
<function name="malloc"><noreturn>false</noreturn><arg nr="1"><not-uninit/></arg></function>
<function name="alloca"><noreturn>false</noreturn><arg nr="1"><not-uninit/></arg></function>
<function name="malloc"><use-retval/><noreturn>false</noreturn><arg nr="1"><not-uninit/></arg></function>
<function name="alloca"><use-retval/><noreturn>false</noreturn><arg nr="1"><not-uninit/></arg></function>
<function name="memchr">
<use-retval/>
<pure/>
<noreturn>false</noreturn>
<leak-ignore/>
@ -330,6 +340,7 @@
<arg nr="3"><not-bool/><valid>0:</valid></arg>
</function>
<function name="memcmp">
<use-retval/>
<pure/>
<noreturn>false</noreturn>
<leak-ignore/>
@ -364,6 +375,7 @@
<arg nr="1"><not-null/><not-uninit/></arg>
</function>
<function name="modf">
<use-retval/>
<noreturn>false</noreturn>
<leak-ignore/>
<arg nr="1"><not-uninit/></arg>
@ -375,6 +387,7 @@
<arg nr="1"><not-uninit/></arg>
</function>
<function name="pow">
<use-retval/>
<pure/>
<noreturn>false</noreturn>
<leak-ignore/>
@ -400,6 +413,7 @@
<arg nr="any"><not-uninit/></arg>
</function>
<function name="bsearch">
<use-retval/>
<pure/>
<noreturn>false</noreturn>
<leak-ignore/>
@ -459,7 +473,7 @@
<leak-ignore/>
<arg nr="1"><not-null/><not-uninit/></arg>
</function>
<function name="round"><pure/><noreturn>false</noreturn><leak-ignore/><arg nr="1"><not-uninit/></arg></function>
<function name="round"><use-retval/><pure/><noreturn>false</noreturn><leak-ignore/><arg nr="1"><not-uninit/></arg></function>
<function name="scanf">
<noreturn>false</noreturn>
<leak-ignore/>
@ -513,18 +527,21 @@
<arg nr="2"><not-null/><not-uninit/></arg>
</function>
<function name="strchr">
<use-retval/>
<noreturn>false</noreturn>
<leak-ignore/>
<arg nr="1"><not-null/><not-uninit/></arg>
<arg nr="2"><not-uninit/></arg>
</function>
<function name="wcschr">
<use-retval/>
<noreturn>false</noreturn>
<leak-ignore/>
<arg nr="1"><not-null/><not-uninit/></arg>
<arg nr="2"><not-uninit/></arg>
</function>
<function name="strcmp">
<use-retval/>
<noreturn>false</noreturn>
<pure/>
<leak-ignore/>
@ -532,6 +549,7 @@
<arg nr="2"><not-null/><not-uninit/></arg>
</function>
<function name="wcscmp">
<use-retval/>
<noreturn>false</noreturn>
<pure/>
<leak-ignore/>
@ -559,11 +577,13 @@
<arg nr="4"><not-null/><not-uninit/></arg>
</function>
<function name="strlen">
<use-retval/>
<noreturn>false</noreturn>
<leak-ignore/>
<arg nr="1"><not-null/><not-uninit/></arg>
</function>
<function name="wcslen">
<use-retval/>
<noreturn>false</noreturn>
<leak-ignore/>
<arg nr="1"><not-null/><not-uninit/></arg>
@ -590,6 +610,7 @@
<arg nr="3"><not-bool/><valid>0:</valid></arg>
</function>
<function name="strncmp">
<use-retval/>
<noreturn>false</noreturn>
<leak-ignore/>
<arg nr="1"><not-null/><not-uninit/></arg>
@ -597,6 +618,7 @@
<arg nr="3"><not-bool/><valid>0:</valid></arg>
</function>
<function name="wcsncmp">
<use-retval/>
<noreturn>false</noreturn>
<leak-ignore/>
<arg nr="1"><not-null/><not-uninit/></arg>
@ -604,18 +626,21 @@
<arg nr="3"><not-bool/><valid>0:</valid></arg>
</function>
<function name="strstr">
<use-retval/>
<noreturn>false</noreturn>
<leak-ignore/>
<arg nr="1"><not-null/><not-uninit/></arg>
<arg nr="2"><not-null/><not-uninit/></arg>
</function>
<function name="wcsstr">
<use-retval/>
<noreturn>false</noreturn>
<leak-ignore/>
<arg nr="1"><not-null/><not-uninit/></arg>
<arg nr="2"><not-null/><not-uninit/></arg>
</function>
<function name="strspn">
<use-retval/>
<noreturn>false</noreturn>
<leak-ignore/>
<arg nr="1"><not-null/><not-uninit/></arg>
@ -636,28 +661,33 @@
<arg nr="3"><not-uninit/></arg>
</function>
<function name="wcsspn">
<use-retval/>
<noreturn>false</noreturn>
<leak-ignore/>
<arg nr="1"><not-null/><not-uninit/></arg>
<arg nr="2"><not-null/><not-uninit/></arg>
</function>
<function name="strerror">
<use-retval/>
<noreturn>false</noreturn>
<leak-ignore/>
</function>
<function name="strcspn">
<use-retval/>
<noreturn>false</noreturn>
<leak-ignore/>
<arg nr="1"><not-null/><not-uninit/></arg>
<arg nr="2"><not-null/><not-uninit/></arg>
</function>
<function name="wcscspn">
<use-retval/>
<noreturn>false</noreturn>
<leak-ignore/>
<arg nr="1"><not-null/><not-uninit/></arg>
<arg nr="2"><not-null/><not-uninit/></arg>
</function>
<function name="wcspbrk">
<use-retval/>
<noreturn>false</noreturn>
<leak-ignore/>
<arg nr="1"><not-null/><not-uninit/></arg>
@ -671,24 +701,28 @@
<arg nr="3"><not-uninit/></arg>
</function>
<function name="strcoll">
<use-retval/>
<noreturn>false</noreturn>
<leak-ignore/>
<arg nr="1"><not-null/><not-uninit/></arg>
<arg nr="2"><not-null/><not-uninit/></arg>
</function>
<function name="wcscoll">
<use-retval/>
<noreturn>false</noreturn>
<leak-ignore/>
<arg nr="1"><not-null/><not-uninit/></arg>
<arg nr="2"><not-null/><not-uninit/></arg>
</function>
<function name="strrchr">
<use-retval/>
<noreturn>false</noreturn>
<leak-ignore/>
<arg nr="1"><not-null/><not-uninit/></arg>
<arg nr="2"><valid>0:255</valid></arg>
</function>
<function name="strbprk">
<use-retval/>
<noreturn>false</noreturn>
<leak-ignore/>
<pure/>
@ -696,11 +730,13 @@
<arg nr="2"><not-null/><not-uninit/></arg>
</function>
<function name="wcsrchr">
<use-retval/>
<noreturn>false</noreturn>
<leak-ignore/>
<arg nr="1"><not-null/><not-uninit/></arg>
</function>
<function name="strtok">
<use-retval/>
<noreturn>false</noreturn>
<pure/>
<leak-ignore/>
@ -713,87 +749,101 @@
</arg>
</function>
<function name="strtol">
<use-retval/>
<noreturn>false</noreturn>
<leak-ignore/>
<arg nr="1"><not-null/><not-uninit/></arg>
<arg nr="3"><valid>0,2:36</valid></arg>
</function>
<function name="strtof">
<use-retval/>
<noreturn>false</noreturn>
<leak-ignore/>
<arg nr="1"><not-null/><not-uninit/></arg>
</function>
<function name="strtod">
<use-retval/>
<noreturn>false</noreturn>
<leak-ignore/>
<arg nr="1"><not-null/><not-uninit/></arg>
</function>
<function name="strtold">
<use-retval/>
<noreturn>false</noreturn>
<leak-ignore/>
<arg nr="1"><not-null/><not-uninit/></arg>
</function>
<function name="strtoul">
<use-retval/>
<noreturn>false</noreturn>
<leak-ignore/>
<arg nr="1"><not-null/><not-uninit/></arg>
<arg nr="3"><valid>0,2:36</valid></arg>
</function>
<function name="strtoll">
<use-retval/>
<noreturn>false</noreturn>
<leak-ignore/>
<arg nr="1"><not-null/><not-uninit/></arg>
<arg nr="3"><valid>0,2:36</valid></arg>
</function>
<function name="strtoull">
<use-retval/>
<noreturn>false</noreturn>
<leak-ignore/>
<arg nr="1"><not-null/><not-uninit/>
</arg> <arg nr="3"><valid>0,2:36</valid></arg>
</function>
<function name="time"> <noreturn>false</noreturn> <leak-ignore/> </function>
<function name="time"> <use-retval/> <noreturn>false</noreturn> <leak-ignore/> </function>
<function name="tmpnam"> <noreturn>false</noreturn> <leak-ignore/> <arg nr="1"></arg></function>
<function name="tmpfile"> <noreturn>false</noreturn> </function>
<function name="tolower"> <noreturn>false</noreturn> <leak-ignore/> <arg nr="1"><valid>0:255</valid></arg> </function>
<function name="toupper"> <noreturn>false</noreturn> <leak-ignore/> <arg nr="1"><valid>0:255</valid></arg> </function>
<function name="tmpfile"> <use-retval/> <noreturn>false</noreturn> </function>
<function name="tolower"> <use-retval/> <noreturn>false</noreturn> <leak-ignore/> <arg nr="1"><valid>0:255</valid></arg> </function>
<function name="toupper"> <use-retval/> <noreturn>false</noreturn> <leak-ignore/> <arg nr="1"><valid>0:255</valid></arg> </function>
<function name="va_arg"> <noreturn>false</noreturn> <leak-ignore/> </function>
<function name="va_copy"> <noreturn>false</noreturn> <leak-ignore/> </function>
<function name="va_end"> <noreturn>false</noreturn> <leak-ignore/> </function>
<function name="va_start"> <noreturn>false</noreturn> <leak-ignore/> </function>
<function name="wcstof">
<use-retval/>
<noreturn>false</noreturn>
<leak-ignore/>
<arg nr="1"><not-null/><not-uninit/></arg>
</function>
<function name="wcstod">
<use-retval/>
<noreturn>false</noreturn>
<leak-ignore/>
<arg nr="1"><not-null/><not-uninit/></arg>
</function>
<function name="wcstold">
<use-retval/>
<noreturn>false</noreturn>
<leak-ignore/>
<arg nr="1"><not-null/><not-uninit/></arg>
</function>
<function name="wcstol">
<use-retval/>
<noreturn>false</noreturn>
<leak-ignore/>
<arg nr="1"><not-null/><not-uninit/></arg>
<arg nr="1"><not-null/><not-uninit/></arg>
<arg nr="3"><valid>0,2:36</valid></arg>
</function>
<function name="wcstoll">
<use-retval/>
<noreturn>false</noreturn>
<leak-ignore/>
<arg nr="1"><not-null/><not-uninit/></arg>
<arg nr="3"><valid>0,2:36</valid></arg>
</function>
<function name="wcstoul">
<use-retval/>
<noreturn>false</noreturn>
<leak-ignore/>
<arg nr="1"><not-null/><not-uninit/></arg>
<arg nr="3"><valid>0,2:36</valid></arg>
</function>
<function name="wcstoull">
<use-retval/>
<noreturn>false</noreturn>
<leak-ignore/>
<arg nr="1"><not-null/><not-uninit/></arg>

View File

@ -2740,3 +2740,31 @@ void CheckOther::varFuncNullUBError(const Token *tok)
" return 0;\n"
"}");
}
//---------------------------------------------------------------------------
// Check for ignored return values.
//---------------------------------------------------------------------------
void CheckOther::checkReturnIgnoredReturnValue()
{
if (!_settings->isEnabled("warning"))
return;
const SymbolDatabase *symbolDatabase = _tokenizer->getSymbolDatabase();
const std::size_t functions = symbolDatabase->functionScopes.size();
for (std::size_t i = 0; i < functions; ++i) {
const Scope * scope = symbolDatabase->functionScopes[i];
for (const Token* tok = scope->classStart; tok != scope->classEnd; tok = tok->next()) {
if (!Token::Match(tok, "%var% ("))
continue;
if (!tok->next()->astParent() && _settings->library.useretval.find(tok->str()) != _settings->library.useretval.end())
ignoredReturnValueError(tok, tok->str());
}
}
}
void CheckOther::ignoredReturnValueError(const Token* tok, const std::string& function)
{
reportError(tok, Severity::warning, "ignoredReturnValue",
"Return value of function " + function + "() is not used.", false);
}

View File

@ -73,6 +73,7 @@ public:
checkOther.checkVarFuncNullUB();
checkOther.checkNanInArithmeticExpression();
checkOther.checkCommaSeparatedReturn();
checkOther.checkReturnIgnoredReturnValue();
}
/** @brief Run checks against the simplified token list */
@ -229,6 +230,9 @@ public:
/** @brief %Check for using of comparison functions evaluating always to true or false. */
void checkComparisonFunctionIsAlwaysTrueOrFalse();
/** @brief %Check for ignored return values. */
void checkReturnIgnoredReturnValue();
private:
// Error messages..
void checkComparisonFunctionIsAlwaysTrueOrFalseError(const Token* tok, const std::string &strFunctionName, const std::string &varName, const bool result);
@ -282,6 +286,7 @@ private:
void incompleteArrayFillError(const Token* tok, const std::string& buffer, const std::string& function, bool boolean);
void varFuncNullUBError(const Token *tok);
void commaSeparatedReturnError(const Token *tok);
void ignoredReturnValueError(const Token* tok, const std::string& function);
void getErrorMessages(ErrorLogger *errorLogger, const Settings *settings) const {
CheckOther c(0, settings, errorLogger);
@ -337,6 +342,7 @@ private:
c.varFuncNullUBError(0);
c.nanInArithmeticExpressionError(0);
c.commaSeparatedReturnError(0);
c.ignoredReturnValueError(0, "malloc");
}
static std::string myName() {
@ -361,6 +367,7 @@ private:
// warning
"* either division by zero or useless condition\n"
"* memset() with a value out of range as the 2nd parameter\n"
"* return value of certain functions not used\n"
// performance
"* redundant data copying for const variable\n"

View File

@ -163,6 +163,8 @@ Library::Error Library::load(const tinyxml2::XMLDocument &doc)
functionpure.insert(name); // a constant function is pure
} else if (functionnodename == "leak-ignore")
leakignore.insert(name);
else if (functionnodename == "use-retval")
useretval.insert(name);
else if (functionnodename == "arg" && functionnode->Attribute("nr") != nullptr) {
const bool bAnyArg = strcmp(functionnode->Attribute("nr"),"any")==0;
const int nr = (bAnyArg) ? -1 : atoi(functionnode->Attribute("nr"));

View File

@ -123,6 +123,7 @@ public:
std::set<std::string> leakignore;
std::set<std::string> functionconst;
std::set<std::string> functionpure;
std::set<std::string> useretval;
bool isnoreturn(const std::string &name) const {
std::map<std::string, bool>::const_iterator it = _noreturn.find(name);

View File

@ -33,9 +33,11 @@ public:
}
private:
Settings settings_std;
void run() {
LOAD_LIB_2(settings_std.library, "std.cfg");
TEST_CASE(emptyBrackets);
TEST_CASE(zeroDiv1);
@ -167,7 +169,9 @@ private:
TEST_CASE(checkComparisonFunctionIsAlwaysTrueOrFalse);
TEST_CASE(integerOverflow) // #5895
TEST_CASE(integerOverflow); // #5895
TEST_CASE(testReturnIgnoredReturnValue);
}
void check(const char code[], const char *filename = nullptr, bool experimental = false, bool inconclusive = true, bool posix = false, bool runSimpleChecks=true, Settings* settings = 0) {
@ -4174,14 +4178,10 @@ private:
"}");
ASSERT_EQUALS("", errout.str());
{
Settings settings;
LOAD_LIB_2(settings.library, "std.cfg");
check("void foo() {\n"
" if ((strcmp(a, b) == 0) || (strcmp(a, b) == 0)) {}\n"
"}", "test.cpp", false, false, false, true, &settings);
ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:2]: (style) Same expression on both sides of '||'.\n", errout.str());
}
check("void foo() {\n"
" if ((strcmp(a, b) == 0) || (strcmp(a, b) == 0)) {}\n"
"}", "test.cpp", false, false, false, true, &settings_std);
ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:2]: (style) Same expression on both sides of '||'.\n", errout.str());
check("void GetValue() { return rand(); }\n"
"void foo() {\n"
@ -4785,14 +4785,12 @@ private:
"}");
ASSERT_EQUALS("[test.cpp:4]: (error) Memory pointed to by 'p' is freed twice.\n", errout.str());
Settings settings;
LOAD_LIB_2(settings.library, "std.cfg");
check(
"void foo(char *p) {\n"
" free(p);\n"
" printf(\"Freed memory at location %x\", p);\n"
" free(p);\n"
"}", nullptr, false, false, false, true, &settings);
"}", nullptr, false, false, false, true, &settings_std);
ASSERT_EQUALS("[test.cpp:4]: (error) Memory pointed to by 'p' is freed twice.\n", errout.str());
check(
@ -6260,6 +6258,28 @@ private:
"}\n");
ASSERT_EQUALS("", errout.str());
}
void testReturnIgnoredReturnValue() {
check("void foo() {\n"
" strcmp(a, b);\n"
"}", "test.cpp", false, false, false, true, &settings_std);
ASSERT_EQUALS("[test.cpp:2]: (warning) Return value of function strcmp() is not used.\n", errout.str());
check("void foo() {\n"
" return strcmp(a, b);\n"
"}", "test.cpp", false, false, false, true, &settings_std);
ASSERT_EQUALS("", errout.str());
check("void foo() {\n"
" if(strcmp(a, b));\n"
"}", "test.cpp", false, false, false, true, &settings_std);
ASSERT_EQUALS("", errout.str());
check("void foo() {\n"
" bool b = strcmp(a, b);\n"
"}", "test.cpp", false, false, false, true, &settings_std);
ASSERT_EQUALS("", errout.str());
}
};
REGISTER_TEST(TestOther)