New check: Check for unused return values (#653)
This commit is contained in:
parent
b0c34390cd
commit
210294443e
142
cfg/std.cfg
142
cfg/std.cfg
|
@ -1,40 +1,42 @@
|
||||||
<?xml version="1.0"?>
|
<?xml version="1.0"?>
|
||||||
<def>
|
<def>
|
||||||
<function name="abort"><noreturn>true</noreturn></function>
|
<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="abs"><use-retval/><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="acos"><use-retval/><pure/><noreturn>false</noreturn><leak-ignore/><arg nr="1"><not-uninit/></arg></function>
|
||||||
<function name="asctime">
|
<function name="asctime">
|
||||||
<noreturn>false</noreturn>
|
<use-retval/>
|
||||||
<leak-ignore/>
|
<noreturn>false</noreturn>
|
||||||
<arg nr="1"><not-uninit/></arg>
|
<leak-ignore/>
|
||||||
|
<arg nr="1"><not-uninit/></arg>
|
||||||
</function>
|
</function>
|
||||||
<function name="assert">
|
<function name="assert">
|
||||||
<leak-ignore/>
|
<leak-ignore/>
|
||||||
</function>
|
</function>
|
||||||
<function name="asin"><pure/><noreturn>false</noreturn><leak-ignore/><arg nr="1"><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"><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"><pure/><noreturn>false</noreturn><leak-ignore/><arg nr="1"><not-uninit/></arg><arg nr="2"><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="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="atof"><use-retval/><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="atoi"><use-retval/><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="atol"><use-retval/><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="atoll"><use-retval/><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="calloc"><use-retval/><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="ceil"><use-retval/><pure/><noreturn>false</noreturn><leak-ignore/><arg nr="1"><not-uninit/></arg></function>
|
||||||
<function name="clearerr">
|
<function name="clearerr">
|
||||||
<noreturn>false</noreturn>
|
<noreturn>false</noreturn>
|
||||||
<leak-ignore/>
|
<leak-ignore/>
|
||||||
<arg nr="1"><not-null/><not-uninit/></arg>
|
<arg nr="1"><not-null/><not-uninit/></arg>
|
||||||
</function>
|
</function>
|
||||||
<function name="clock"><noreturn>false</noreturn><leak-ignore/></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="cos"><use-retval/><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="cosh"><use-retval/><pure/><noreturn>false</noreturn><leak-ignore/><arg nr="1"><not-uninit/></arg></function>
|
||||||
<function name="ctime">
|
<function name="ctime">
|
||||||
|
<use-retval/>
|
||||||
<noreturn>false</noreturn>
|
<noreturn>false</noreturn>
|
||||||
<leak-ignore/>
|
<leak-ignore/>
|
||||||
<arg nr="1"><not-uninit/></arg>
|
<arg nr="1"><not-uninit/></arg>
|
||||||
</function>
|
</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">
|
<function name="div">
|
||||||
<pure/>
|
<pure/>
|
||||||
<noreturn>false</noreturn>
|
<noreturn>false</noreturn>
|
||||||
|
@ -43,18 +45,20 @@
|
||||||
<arg nr="2"><not-uninit/></arg>
|
<arg nr="2"><not-uninit/></arg>
|
||||||
</function>
|
</function>
|
||||||
<function name="exit"><noreturn>true</noreturn><arg nr="1"><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="exp"><use-retval/><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="fabs"><use-retval/><pure/><noreturn>false</noreturn><leak-ignore/><arg nr="1"><not-uninit/></arg></function>
|
||||||
<function name="fclose">
|
<function name="fclose">
|
||||||
<noreturn>false</noreturn>
|
<noreturn>false</noreturn>
|
||||||
<arg nr="1"><not-null/><not-uninit/></arg>
|
<arg nr="1"><not-null/><not-uninit/></arg>
|
||||||
</function>
|
</function>
|
||||||
<function name="feof">
|
<function name="feof">
|
||||||
|
<use-retval/>
|
||||||
<noreturn>false</noreturn>
|
<noreturn>false</noreturn>
|
||||||
<leak-ignore/>
|
<leak-ignore/>
|
||||||
<arg nr="1"><not-null/><not-uninit/></arg>
|
<arg nr="1"><not-null/><not-uninit/></arg>
|
||||||
</function>
|
</function>
|
||||||
<function name="ferror">
|
<function name="ferror">
|
||||||
|
<use-retval/>
|
||||||
<noreturn>false</noreturn>
|
<noreturn>false</noreturn>
|
||||||
<leak-ignore/>
|
<leak-ignore/>
|
||||||
<arg nr="1"><not-null/><not-uninit/></arg>
|
<arg nr="1"><not-null/><not-uninit/></arg>
|
||||||
|
@ -79,9 +83,10 @@
|
||||||
<arg nr="1"><not-null/><not-uninit/></arg>
|
<arg nr="1"><not-null/><not-uninit/></arg>
|
||||||
<arg nr="2"><not-null/><not-uninit/></arg>
|
<arg nr="2"><not-null/><not-uninit/></arg>
|
||||||
</function>
|
</function>
|
||||||
<function name="floor"><pure/><noreturn>false</noreturn><leak-ignore/><arg nr="1"><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"><pure/><noreturn>false</noreturn><leak-ignore/><arg nr="1"><not-uninit/></arg><arg nr="2"><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">
|
<function name="fopen">
|
||||||
|
<use-retval/>
|
||||||
<noreturn>false</noreturn>
|
<noreturn>false</noreturn>
|
||||||
<arg nr="1"><not-null/><not-uninit/></arg>
|
<arg nr="1"><not-null/><not-uninit/></arg>
|
||||||
<arg nr="2"><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>
|
<arg nr="4"><not-null/><not-uninit/></arg>
|
||||||
</function>
|
</function>
|
||||||
<function name="mblen">
|
<function name="mblen">
|
||||||
|
<use-retval/>
|
||||||
<noreturn>false</noreturn>
|
<noreturn>false</noreturn>
|
||||||
<leak-ignore/>
|
<leak-ignore/>
|
||||||
<arg nr="1"><not-uninit/></arg>
|
<arg nr="1"><not-uninit/></arg>
|
||||||
|
@ -251,32 +257,34 @@
|
||||||
<arg nr="1"><not-uninit/></arg>
|
<arg nr="1"><not-uninit/></arg>
|
||||||
<arg nr="1"><not-null/><not-uninit/></arg>
|
<arg nr="1"><not-null/><not-uninit/></arg>
|
||||||
</function>
|
</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">
|
<function name="gets">
|
||||||
<noreturn>false</noreturn>
|
<noreturn>false</noreturn>
|
||||||
<leak-ignore/>
|
<leak-ignore/>
|
||||||
<arg nr="1"><not-null/></arg>
|
<arg nr="1"><not-null/></arg>
|
||||||
</function>
|
</function>
|
||||||
<function name="gmtime">
|
<function name="gmtime">
|
||||||
|
<use-retval/>
|
||||||
<noreturn>false</noreturn>
|
<noreturn>false</noreturn>
|
||||||
<leak-ignore/>
|
<leak-ignore/>
|
||||||
<arg nr="1"><not-null/><not-uninit/></arg>
|
<arg nr="1"><not-null/><not-uninit/></arg>
|
||||||
</function>
|
</function>
|
||||||
<function name="isalnum"> <pure/><noreturn>false</noreturn> <leak-ignore/> <arg nr="1"><valid>0:255</valid></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"> <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"> <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"> <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"> <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"> <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"> <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"> <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"> <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"> <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"> <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"><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"> <pure/><noreturn>false</noreturn><leak-ignore/> <arg nr="1"><not-uninit/></arg></function>
|
<function name="labs"> <use-retval/><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="llabs"> <use-retval/><pure/><noreturn>false</noreturn><leak-ignore/> <arg nr="1"><not-uninit/></arg></function>
|
||||||
<function name="ldexp">
|
<function name="ldexp">
|
||||||
|
<use-retval/>
|
||||||
<pure/>
|
<pure/>
|
||||||
<noreturn>false</noreturn>
|
<noreturn>false</noreturn>
|
||||||
<leak-ignore/>
|
<leak-ignore/>
|
||||||
|
@ -284,6 +292,7 @@
|
||||||
<arg nr="2"><not-uninit/></arg>
|
<arg nr="2"><not-uninit/></arg>
|
||||||
</function>
|
</function>
|
||||||
<function name="rand">
|
<function name="rand">
|
||||||
|
<use-retval/>
|
||||||
<noreturn>false</noreturn>
|
<noreturn>false</noreturn>
|
||||||
<leak-ignore/>
|
<leak-ignore/>
|
||||||
</function>
|
</function>
|
||||||
|
@ -311,17 +320,18 @@
|
||||||
<leak-ignore/>
|
<leak-ignore/>
|
||||||
<arg nr="1"><not-uninit/></arg>
|
<arg nr="1"><not-uninit/></arg>
|
||||||
</function>
|
</function>
|
||||||
<function name="log"><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"><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">
|
<function name="longjmp">
|
||||||
<noreturn>false</noreturn>
|
<noreturn>false</noreturn>
|
||||||
<leak-ignore/>
|
<leak-ignore/>
|
||||||
<arg nr="1"><not-uninit/></arg>
|
<arg nr="1"><not-uninit/></arg>
|
||||||
<arg nr="2"><not-uninit/></arg>
|
<arg nr="2"><not-uninit/></arg>
|
||||||
</function>
|
</function>
|
||||||
<function name="malloc"><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"><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">
|
<function name="memchr">
|
||||||
|
<use-retval/>
|
||||||
<pure/>
|
<pure/>
|
||||||
<noreturn>false</noreturn>
|
<noreturn>false</noreturn>
|
||||||
<leak-ignore/>
|
<leak-ignore/>
|
||||||
|
@ -330,6 +340,7 @@
|
||||||
<arg nr="3"><not-bool/><valid>0:</valid></arg>
|
<arg nr="3"><not-bool/><valid>0:</valid></arg>
|
||||||
</function>
|
</function>
|
||||||
<function name="memcmp">
|
<function name="memcmp">
|
||||||
|
<use-retval/>
|
||||||
<pure/>
|
<pure/>
|
||||||
<noreturn>false</noreturn>
|
<noreturn>false</noreturn>
|
||||||
<leak-ignore/>
|
<leak-ignore/>
|
||||||
|
@ -364,6 +375,7 @@
|
||||||
<arg nr="1"><not-null/><not-uninit/></arg>
|
<arg nr="1"><not-null/><not-uninit/></arg>
|
||||||
</function>
|
</function>
|
||||||
<function name="modf">
|
<function name="modf">
|
||||||
|
<use-retval/>
|
||||||
<noreturn>false</noreturn>
|
<noreturn>false</noreturn>
|
||||||
<leak-ignore/>
|
<leak-ignore/>
|
||||||
<arg nr="1"><not-uninit/></arg>
|
<arg nr="1"><not-uninit/></arg>
|
||||||
|
@ -375,6 +387,7 @@
|
||||||
<arg nr="1"><not-uninit/></arg>
|
<arg nr="1"><not-uninit/></arg>
|
||||||
</function>
|
</function>
|
||||||
<function name="pow">
|
<function name="pow">
|
||||||
|
<use-retval/>
|
||||||
<pure/>
|
<pure/>
|
||||||
<noreturn>false</noreturn>
|
<noreturn>false</noreturn>
|
||||||
<leak-ignore/>
|
<leak-ignore/>
|
||||||
|
@ -400,6 +413,7 @@
|
||||||
<arg nr="any"><not-uninit/></arg>
|
<arg nr="any"><not-uninit/></arg>
|
||||||
</function>
|
</function>
|
||||||
<function name="bsearch">
|
<function name="bsearch">
|
||||||
|
<use-retval/>
|
||||||
<pure/>
|
<pure/>
|
||||||
<noreturn>false</noreturn>
|
<noreturn>false</noreturn>
|
||||||
<leak-ignore/>
|
<leak-ignore/>
|
||||||
|
@ -459,7 +473,7 @@
|
||||||
<leak-ignore/>
|
<leak-ignore/>
|
||||||
<arg nr="1"><not-null/><not-uninit/></arg>
|
<arg nr="1"><not-null/><not-uninit/></arg>
|
||||||
</function>
|
</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">
|
<function name="scanf">
|
||||||
<noreturn>false</noreturn>
|
<noreturn>false</noreturn>
|
||||||
<leak-ignore/>
|
<leak-ignore/>
|
||||||
|
@ -513,18 +527,21 @@
|
||||||
<arg nr="2"><not-null/><not-uninit/></arg>
|
<arg nr="2"><not-null/><not-uninit/></arg>
|
||||||
</function>
|
</function>
|
||||||
<function name="strchr">
|
<function name="strchr">
|
||||||
|
<use-retval/>
|
||||||
<noreturn>false</noreturn>
|
<noreturn>false</noreturn>
|
||||||
<leak-ignore/>
|
<leak-ignore/>
|
||||||
<arg nr="1"><not-null/><not-uninit/></arg>
|
<arg nr="1"><not-null/><not-uninit/></arg>
|
||||||
<arg nr="2"><not-uninit/></arg>
|
<arg nr="2"><not-uninit/></arg>
|
||||||
</function>
|
</function>
|
||||||
<function name="wcschr">
|
<function name="wcschr">
|
||||||
|
<use-retval/>
|
||||||
<noreturn>false</noreturn>
|
<noreturn>false</noreturn>
|
||||||
<leak-ignore/>
|
<leak-ignore/>
|
||||||
<arg nr="1"><not-null/><not-uninit/></arg>
|
<arg nr="1"><not-null/><not-uninit/></arg>
|
||||||
<arg nr="2"><not-uninit/></arg>
|
<arg nr="2"><not-uninit/></arg>
|
||||||
</function>
|
</function>
|
||||||
<function name="strcmp">
|
<function name="strcmp">
|
||||||
|
<use-retval/>
|
||||||
<noreturn>false</noreturn>
|
<noreturn>false</noreturn>
|
||||||
<pure/>
|
<pure/>
|
||||||
<leak-ignore/>
|
<leak-ignore/>
|
||||||
|
@ -532,6 +549,7 @@
|
||||||
<arg nr="2"><not-null/><not-uninit/></arg>
|
<arg nr="2"><not-null/><not-uninit/></arg>
|
||||||
</function>
|
</function>
|
||||||
<function name="wcscmp">
|
<function name="wcscmp">
|
||||||
|
<use-retval/>
|
||||||
<noreturn>false</noreturn>
|
<noreturn>false</noreturn>
|
||||||
<pure/>
|
<pure/>
|
||||||
<leak-ignore/>
|
<leak-ignore/>
|
||||||
|
@ -559,11 +577,13 @@
|
||||||
<arg nr="4"><not-null/><not-uninit/></arg>
|
<arg nr="4"><not-null/><not-uninit/></arg>
|
||||||
</function>
|
</function>
|
||||||
<function name="strlen">
|
<function name="strlen">
|
||||||
|
<use-retval/>
|
||||||
<noreturn>false</noreturn>
|
<noreturn>false</noreturn>
|
||||||
<leak-ignore/>
|
<leak-ignore/>
|
||||||
<arg nr="1"><not-null/><not-uninit/></arg>
|
<arg nr="1"><not-null/><not-uninit/></arg>
|
||||||
</function>
|
</function>
|
||||||
<function name="wcslen">
|
<function name="wcslen">
|
||||||
|
<use-retval/>
|
||||||
<noreturn>false</noreturn>
|
<noreturn>false</noreturn>
|
||||||
<leak-ignore/>
|
<leak-ignore/>
|
||||||
<arg nr="1"><not-null/><not-uninit/></arg>
|
<arg nr="1"><not-null/><not-uninit/></arg>
|
||||||
|
@ -590,6 +610,7 @@
|
||||||
<arg nr="3"><not-bool/><valid>0:</valid></arg>
|
<arg nr="3"><not-bool/><valid>0:</valid></arg>
|
||||||
</function>
|
</function>
|
||||||
<function name="strncmp">
|
<function name="strncmp">
|
||||||
|
<use-retval/>
|
||||||
<noreturn>false</noreturn>
|
<noreturn>false</noreturn>
|
||||||
<leak-ignore/>
|
<leak-ignore/>
|
||||||
<arg nr="1"><not-null/><not-uninit/></arg>
|
<arg nr="1"><not-null/><not-uninit/></arg>
|
||||||
|
@ -597,6 +618,7 @@
|
||||||
<arg nr="3"><not-bool/><valid>0:</valid></arg>
|
<arg nr="3"><not-bool/><valid>0:</valid></arg>
|
||||||
</function>
|
</function>
|
||||||
<function name="wcsncmp">
|
<function name="wcsncmp">
|
||||||
|
<use-retval/>
|
||||||
<noreturn>false</noreturn>
|
<noreturn>false</noreturn>
|
||||||
<leak-ignore/>
|
<leak-ignore/>
|
||||||
<arg nr="1"><not-null/><not-uninit/></arg>
|
<arg nr="1"><not-null/><not-uninit/></arg>
|
||||||
|
@ -604,18 +626,21 @@
|
||||||
<arg nr="3"><not-bool/><valid>0:</valid></arg>
|
<arg nr="3"><not-bool/><valid>0:</valid></arg>
|
||||||
</function>
|
</function>
|
||||||
<function name="strstr">
|
<function name="strstr">
|
||||||
|
<use-retval/>
|
||||||
<noreturn>false</noreturn>
|
<noreturn>false</noreturn>
|
||||||
<leak-ignore/>
|
<leak-ignore/>
|
||||||
<arg nr="1"><not-null/><not-uninit/></arg>
|
<arg nr="1"><not-null/><not-uninit/></arg>
|
||||||
<arg nr="2"><not-null/><not-uninit/></arg>
|
<arg nr="2"><not-null/><not-uninit/></arg>
|
||||||
</function>
|
</function>
|
||||||
<function name="wcsstr">
|
<function name="wcsstr">
|
||||||
|
<use-retval/>
|
||||||
<noreturn>false</noreturn>
|
<noreturn>false</noreturn>
|
||||||
<leak-ignore/>
|
<leak-ignore/>
|
||||||
<arg nr="1"><not-null/><not-uninit/></arg>
|
<arg nr="1"><not-null/><not-uninit/></arg>
|
||||||
<arg nr="2"><not-null/><not-uninit/></arg>
|
<arg nr="2"><not-null/><not-uninit/></arg>
|
||||||
</function>
|
</function>
|
||||||
<function name="strspn">
|
<function name="strspn">
|
||||||
|
<use-retval/>
|
||||||
<noreturn>false</noreturn>
|
<noreturn>false</noreturn>
|
||||||
<leak-ignore/>
|
<leak-ignore/>
|
||||||
<arg nr="1"><not-null/><not-uninit/></arg>
|
<arg nr="1"><not-null/><not-uninit/></arg>
|
||||||
|
@ -636,28 +661,33 @@
|
||||||
<arg nr="3"><not-uninit/></arg>
|
<arg nr="3"><not-uninit/></arg>
|
||||||
</function>
|
</function>
|
||||||
<function name="wcsspn">
|
<function name="wcsspn">
|
||||||
|
<use-retval/>
|
||||||
<noreturn>false</noreturn>
|
<noreturn>false</noreturn>
|
||||||
<leak-ignore/>
|
<leak-ignore/>
|
||||||
<arg nr="1"><not-null/><not-uninit/></arg>
|
<arg nr="1"><not-null/><not-uninit/></arg>
|
||||||
<arg nr="2"><not-null/><not-uninit/></arg>
|
<arg nr="2"><not-null/><not-uninit/></arg>
|
||||||
</function>
|
</function>
|
||||||
<function name="strerror">
|
<function name="strerror">
|
||||||
|
<use-retval/>
|
||||||
<noreturn>false</noreturn>
|
<noreturn>false</noreturn>
|
||||||
<leak-ignore/>
|
<leak-ignore/>
|
||||||
</function>
|
</function>
|
||||||
<function name="strcspn">
|
<function name="strcspn">
|
||||||
|
<use-retval/>
|
||||||
<noreturn>false</noreturn>
|
<noreturn>false</noreturn>
|
||||||
<leak-ignore/>
|
<leak-ignore/>
|
||||||
<arg nr="1"><not-null/><not-uninit/></arg>
|
<arg nr="1"><not-null/><not-uninit/></arg>
|
||||||
<arg nr="2"><not-null/><not-uninit/></arg>
|
<arg nr="2"><not-null/><not-uninit/></arg>
|
||||||
</function>
|
</function>
|
||||||
<function name="wcscspn">
|
<function name="wcscspn">
|
||||||
|
<use-retval/>
|
||||||
<noreturn>false</noreturn>
|
<noreturn>false</noreturn>
|
||||||
<leak-ignore/>
|
<leak-ignore/>
|
||||||
<arg nr="1"><not-null/><not-uninit/></arg>
|
<arg nr="1"><not-null/><not-uninit/></arg>
|
||||||
<arg nr="2"><not-null/><not-uninit/></arg>
|
<arg nr="2"><not-null/><not-uninit/></arg>
|
||||||
</function>
|
</function>
|
||||||
<function name="wcspbrk">
|
<function name="wcspbrk">
|
||||||
|
<use-retval/>
|
||||||
<noreturn>false</noreturn>
|
<noreturn>false</noreturn>
|
||||||
<leak-ignore/>
|
<leak-ignore/>
|
||||||
<arg nr="1"><not-null/><not-uninit/></arg>
|
<arg nr="1"><not-null/><not-uninit/></arg>
|
||||||
|
@ -671,24 +701,28 @@
|
||||||
<arg nr="3"><not-uninit/></arg>
|
<arg nr="3"><not-uninit/></arg>
|
||||||
</function>
|
</function>
|
||||||
<function name="strcoll">
|
<function name="strcoll">
|
||||||
|
<use-retval/>
|
||||||
<noreturn>false</noreturn>
|
<noreturn>false</noreturn>
|
||||||
<leak-ignore/>
|
<leak-ignore/>
|
||||||
<arg nr="1"><not-null/><not-uninit/></arg>
|
<arg nr="1"><not-null/><not-uninit/></arg>
|
||||||
<arg nr="2"><not-null/><not-uninit/></arg>
|
<arg nr="2"><not-null/><not-uninit/></arg>
|
||||||
</function>
|
</function>
|
||||||
<function name="wcscoll">
|
<function name="wcscoll">
|
||||||
|
<use-retval/>
|
||||||
<noreturn>false</noreturn>
|
<noreturn>false</noreturn>
|
||||||
<leak-ignore/>
|
<leak-ignore/>
|
||||||
<arg nr="1"><not-null/><not-uninit/></arg>
|
<arg nr="1"><not-null/><not-uninit/></arg>
|
||||||
<arg nr="2"><not-null/><not-uninit/></arg>
|
<arg nr="2"><not-null/><not-uninit/></arg>
|
||||||
</function>
|
</function>
|
||||||
<function name="strrchr">
|
<function name="strrchr">
|
||||||
|
<use-retval/>
|
||||||
<noreturn>false</noreturn>
|
<noreturn>false</noreturn>
|
||||||
<leak-ignore/>
|
<leak-ignore/>
|
||||||
<arg nr="1"><not-null/><not-uninit/></arg>
|
<arg nr="1"><not-null/><not-uninit/></arg>
|
||||||
<arg nr="2"><valid>0:255</valid></arg>
|
<arg nr="2"><valid>0:255</valid></arg>
|
||||||
</function>
|
</function>
|
||||||
<function name="strbprk">
|
<function name="strbprk">
|
||||||
|
<use-retval/>
|
||||||
<noreturn>false</noreturn>
|
<noreturn>false</noreturn>
|
||||||
<leak-ignore/>
|
<leak-ignore/>
|
||||||
<pure/>
|
<pure/>
|
||||||
|
@ -696,11 +730,13 @@
|
||||||
<arg nr="2"><not-null/><not-uninit/></arg>
|
<arg nr="2"><not-null/><not-uninit/></arg>
|
||||||
</function>
|
</function>
|
||||||
<function name="wcsrchr">
|
<function name="wcsrchr">
|
||||||
|
<use-retval/>
|
||||||
<noreturn>false</noreturn>
|
<noreturn>false</noreturn>
|
||||||
<leak-ignore/>
|
<leak-ignore/>
|
||||||
<arg nr="1"><not-null/><not-uninit/></arg>
|
<arg nr="1"><not-null/><not-uninit/></arg>
|
||||||
</function>
|
</function>
|
||||||
<function name="strtok">
|
<function name="strtok">
|
||||||
|
<use-retval/>
|
||||||
<noreturn>false</noreturn>
|
<noreturn>false</noreturn>
|
||||||
<pure/>
|
<pure/>
|
||||||
<leak-ignore/>
|
<leak-ignore/>
|
||||||
|
@ -713,87 +749,101 @@
|
||||||
</arg>
|
</arg>
|
||||||
</function>
|
</function>
|
||||||
<function name="strtol">
|
<function name="strtol">
|
||||||
|
<use-retval/>
|
||||||
<noreturn>false</noreturn>
|
<noreturn>false</noreturn>
|
||||||
<leak-ignore/>
|
<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>
|
<arg nr="3"><valid>0,2:36</valid></arg>
|
||||||
</function>
|
</function>
|
||||||
<function name="strtof">
|
<function name="strtof">
|
||||||
|
<use-retval/>
|
||||||
<noreturn>false</noreturn>
|
<noreturn>false</noreturn>
|
||||||
<leak-ignore/>
|
<leak-ignore/>
|
||||||
<arg nr="1"><not-null/><not-uninit/></arg>
|
<arg nr="1"><not-null/><not-uninit/></arg>
|
||||||
</function>
|
</function>
|
||||||
<function name="strtod">
|
<function name="strtod">
|
||||||
|
<use-retval/>
|
||||||
<noreturn>false</noreturn>
|
<noreturn>false</noreturn>
|
||||||
<leak-ignore/>
|
<leak-ignore/>
|
||||||
<arg nr="1"><not-null/><not-uninit/></arg>
|
<arg nr="1"><not-null/><not-uninit/></arg>
|
||||||
</function>
|
</function>
|
||||||
<function name="strtold">
|
<function name="strtold">
|
||||||
|
<use-retval/>
|
||||||
<noreturn>false</noreturn>
|
<noreturn>false</noreturn>
|
||||||
<leak-ignore/>
|
<leak-ignore/>
|
||||||
<arg nr="1"><not-null/><not-uninit/></arg>
|
<arg nr="1"><not-null/><not-uninit/></arg>
|
||||||
</function>
|
</function>
|
||||||
<function name="strtoul">
|
<function name="strtoul">
|
||||||
|
<use-retval/>
|
||||||
<noreturn>false</noreturn>
|
<noreturn>false</noreturn>
|
||||||
<leak-ignore/>
|
<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>
|
<arg nr="3"><valid>0,2:36</valid></arg>
|
||||||
</function>
|
</function>
|
||||||
<function name="strtoll">
|
<function name="strtoll">
|
||||||
|
<use-retval/>
|
||||||
<noreturn>false</noreturn>
|
<noreturn>false</noreturn>
|
||||||
<leak-ignore/>
|
<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>
|
<arg nr="3"><valid>0,2:36</valid></arg>
|
||||||
</function>
|
</function>
|
||||||
<function name="strtoull">
|
<function name="strtoull">
|
||||||
|
<use-retval/>
|
||||||
<noreturn>false</noreturn>
|
<noreturn>false</noreturn>
|
||||||
<leak-ignore/>
|
<leak-ignore/>
|
||||||
<arg nr="1"><not-null/><not-uninit/>
|
<arg nr="1"><not-null/><not-uninit/>
|
||||||
</arg> <arg nr="3"><valid>0,2:36</valid></arg>
|
</arg> <arg nr="3"><valid>0,2:36</valid></arg>
|
||||||
</function>
|
</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="tmpnam"> <noreturn>false</noreturn> <leak-ignore/> <arg nr="1"></arg></function>
|
||||||
<function name="tmpfile"> <noreturn>false</noreturn> </function>
|
<function name="tmpfile"> <use-retval/> <noreturn>false</noreturn> </function>
|
||||||
<function name="tolower"> <noreturn>false</noreturn> <leak-ignore/> <arg nr="1"><valid>0:255</valid></arg> </function>
|
<function name="tolower"> <use-retval/> <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="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_arg"> <noreturn>false</noreturn> <leak-ignore/> </function>
|
||||||
<function name="va_copy"> <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_end"> <noreturn>false</noreturn> <leak-ignore/> </function>
|
||||||
<function name="va_start"> <noreturn>false</noreturn> <leak-ignore/> </function>
|
<function name="va_start"> <noreturn>false</noreturn> <leak-ignore/> </function>
|
||||||
<function name="wcstof">
|
<function name="wcstof">
|
||||||
|
<use-retval/>
|
||||||
<noreturn>false</noreturn>
|
<noreturn>false</noreturn>
|
||||||
<leak-ignore/>
|
<leak-ignore/>
|
||||||
<arg nr="1"><not-null/><not-uninit/></arg>
|
<arg nr="1"><not-null/><not-uninit/></arg>
|
||||||
</function>
|
</function>
|
||||||
<function name="wcstod">
|
<function name="wcstod">
|
||||||
|
<use-retval/>
|
||||||
<noreturn>false</noreturn>
|
<noreturn>false</noreturn>
|
||||||
<leak-ignore/>
|
<leak-ignore/>
|
||||||
<arg nr="1"><not-null/><not-uninit/></arg>
|
<arg nr="1"><not-null/><not-uninit/></arg>
|
||||||
</function>
|
</function>
|
||||||
<function name="wcstold">
|
<function name="wcstold">
|
||||||
|
<use-retval/>
|
||||||
<noreturn>false</noreturn>
|
<noreturn>false</noreturn>
|
||||||
<leak-ignore/>
|
<leak-ignore/>
|
||||||
<arg nr="1"><not-null/><not-uninit/></arg>
|
<arg nr="1"><not-null/><not-uninit/></arg>
|
||||||
</function>
|
</function>
|
||||||
<function name="wcstol">
|
<function name="wcstol">
|
||||||
|
<use-retval/>
|
||||||
<noreturn>false</noreturn>
|
<noreturn>false</noreturn>
|
||||||
<leak-ignore/>
|
<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>
|
<arg nr="3"><valid>0,2:36</valid></arg>
|
||||||
</function>
|
</function>
|
||||||
<function name="wcstoll">
|
<function name="wcstoll">
|
||||||
|
<use-retval/>
|
||||||
<noreturn>false</noreturn>
|
<noreturn>false</noreturn>
|
||||||
<leak-ignore/>
|
<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>
|
<arg nr="3"><valid>0,2:36</valid></arg>
|
||||||
</function>
|
</function>
|
||||||
<function name="wcstoul">
|
<function name="wcstoul">
|
||||||
|
<use-retval/>
|
||||||
<noreturn>false</noreturn>
|
<noreturn>false</noreturn>
|
||||||
<leak-ignore/>
|
<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>
|
<arg nr="3"><valid>0,2:36</valid></arg>
|
||||||
</function>
|
</function>
|
||||||
<function name="wcstoull">
|
<function name="wcstoull">
|
||||||
|
<use-retval/>
|
||||||
<noreturn>false</noreturn>
|
<noreturn>false</noreturn>
|
||||||
<leak-ignore/>
|
<leak-ignore/>
|
||||||
<arg nr="1"><not-null/><not-uninit/></arg>
|
<arg nr="1"><not-null/><not-uninit/></arg>
|
||||||
|
|
|
@ -2740,3 +2740,31 @@ void CheckOther::varFuncNullUBError(const Token *tok)
|
||||||
" return 0;\n"
|
" 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);
|
||||||
|
}
|
||||||
|
|
|
@ -73,6 +73,7 @@ public:
|
||||||
checkOther.checkVarFuncNullUB();
|
checkOther.checkVarFuncNullUB();
|
||||||
checkOther.checkNanInArithmeticExpression();
|
checkOther.checkNanInArithmeticExpression();
|
||||||
checkOther.checkCommaSeparatedReturn();
|
checkOther.checkCommaSeparatedReturn();
|
||||||
|
checkOther.checkReturnIgnoredReturnValue();
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @brief Run checks against the simplified token list */
|
/** @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. */
|
/** @brief %Check for using of comparison functions evaluating always to true or false. */
|
||||||
void checkComparisonFunctionIsAlwaysTrueOrFalse();
|
void checkComparisonFunctionIsAlwaysTrueOrFalse();
|
||||||
|
|
||||||
|
/** @brief %Check for ignored return values. */
|
||||||
|
void checkReturnIgnoredReturnValue();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// Error messages..
|
// Error messages..
|
||||||
void checkComparisonFunctionIsAlwaysTrueOrFalseError(const Token* tok, const std::string &strFunctionName, const std::string &varName, const bool result);
|
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 incompleteArrayFillError(const Token* tok, const std::string& buffer, const std::string& function, bool boolean);
|
||||||
void varFuncNullUBError(const Token *tok);
|
void varFuncNullUBError(const Token *tok);
|
||||||
void commaSeparatedReturnError(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 {
|
void getErrorMessages(ErrorLogger *errorLogger, const Settings *settings) const {
|
||||||
CheckOther c(0, settings, errorLogger);
|
CheckOther c(0, settings, errorLogger);
|
||||||
|
@ -337,6 +342,7 @@ private:
|
||||||
c.varFuncNullUBError(0);
|
c.varFuncNullUBError(0);
|
||||||
c.nanInArithmeticExpressionError(0);
|
c.nanInArithmeticExpressionError(0);
|
||||||
c.commaSeparatedReturnError(0);
|
c.commaSeparatedReturnError(0);
|
||||||
|
c.ignoredReturnValueError(0, "malloc");
|
||||||
}
|
}
|
||||||
|
|
||||||
static std::string myName() {
|
static std::string myName() {
|
||||||
|
@ -361,6 +367,7 @@ private:
|
||||||
// warning
|
// warning
|
||||||
"* either division by zero or useless condition\n"
|
"* either division by zero or useless condition\n"
|
||||||
"* memset() with a value out of range as the 2nd parameter\n"
|
"* memset() with a value out of range as the 2nd parameter\n"
|
||||||
|
"* return value of certain functions not used\n"
|
||||||
|
|
||||||
// performance
|
// performance
|
||||||
"* redundant data copying for const variable\n"
|
"* redundant data copying for const variable\n"
|
||||||
|
|
|
@ -163,6 +163,8 @@ Library::Error Library::load(const tinyxml2::XMLDocument &doc)
|
||||||
functionpure.insert(name); // a constant function is pure
|
functionpure.insert(name); // a constant function is pure
|
||||||
} else if (functionnodename == "leak-ignore")
|
} else if (functionnodename == "leak-ignore")
|
||||||
leakignore.insert(name);
|
leakignore.insert(name);
|
||||||
|
else if (functionnodename == "use-retval")
|
||||||
|
useretval.insert(name);
|
||||||
else if (functionnodename == "arg" && functionnode->Attribute("nr") != nullptr) {
|
else if (functionnodename == "arg" && functionnode->Attribute("nr") != nullptr) {
|
||||||
const bool bAnyArg = strcmp(functionnode->Attribute("nr"),"any")==0;
|
const bool bAnyArg = strcmp(functionnode->Attribute("nr"),"any")==0;
|
||||||
const int nr = (bAnyArg) ? -1 : atoi(functionnode->Attribute("nr"));
|
const int nr = (bAnyArg) ? -1 : atoi(functionnode->Attribute("nr"));
|
||||||
|
|
|
@ -123,6 +123,7 @@ public:
|
||||||
std::set<std::string> leakignore;
|
std::set<std::string> leakignore;
|
||||||
std::set<std::string> functionconst;
|
std::set<std::string> functionconst;
|
||||||
std::set<std::string> functionpure;
|
std::set<std::string> functionpure;
|
||||||
|
std::set<std::string> useretval;
|
||||||
|
|
||||||
bool isnoreturn(const std::string &name) const {
|
bool isnoreturn(const std::string &name) const {
|
||||||
std::map<std::string, bool>::const_iterator it = _noreturn.find(name);
|
std::map<std::string, bool>::const_iterator it = _noreturn.find(name);
|
||||||
|
|
|
@ -33,9 +33,11 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
Settings settings_std;
|
||||||
|
|
||||||
void run() {
|
void run() {
|
||||||
|
LOAD_LIB_2(settings_std.library, "std.cfg");
|
||||||
|
|
||||||
TEST_CASE(emptyBrackets);
|
TEST_CASE(emptyBrackets);
|
||||||
|
|
||||||
TEST_CASE(zeroDiv1);
|
TEST_CASE(zeroDiv1);
|
||||||
|
@ -167,7 +169,9 @@ private:
|
||||||
|
|
||||||
TEST_CASE(checkComparisonFunctionIsAlwaysTrueOrFalse);
|
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) {
|
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());
|
ASSERT_EQUALS("", errout.str());
|
||||||
|
|
||||||
{
|
check("void foo() {\n"
|
||||||
Settings settings;
|
" if ((strcmp(a, b) == 0) || (strcmp(a, b) == 0)) {}\n"
|
||||||
LOAD_LIB_2(settings.library, "std.cfg");
|
"}", "test.cpp", false, false, false, true, &settings_std);
|
||||||
check("void foo() {\n"
|
ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:2]: (style) Same expression on both sides of '||'.\n", errout.str());
|
||||||
" 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 GetValue() { return rand(); }\n"
|
check("void GetValue() { return rand(); }\n"
|
||||||
"void foo() {\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());
|
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(
|
check(
|
||||||
"void foo(char *p) {\n"
|
"void foo(char *p) {\n"
|
||||||
" free(p);\n"
|
" free(p);\n"
|
||||||
" printf(\"Freed memory at location %x\", p);\n"
|
" printf(\"Freed memory at location %x\", p);\n"
|
||||||
" free(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());
|
ASSERT_EQUALS("[test.cpp:4]: (error) Memory pointed to by 'p' is freed twice.\n", errout.str());
|
||||||
|
|
||||||
check(
|
check(
|
||||||
|
@ -6260,6 +6258,28 @@ private:
|
||||||
"}\n");
|
"}\n");
|
||||||
ASSERT_EQUALS("", errout.str());
|
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)
|
REGISTER_TEST(TestOther)
|
||||||
|
|
Loading…
Reference in New Issue