Skip to content

Commit fe1b46c

Browse files
orbitcowboydanmar
authored andcommitted
Extended std.cfg
1 parent 5c88934 commit fe1b46c

4 files changed

Lines changed: 219 additions & 23 deletions

File tree

cfg/std.cfg

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,20 @@
1515
<alloc init="true">fopen</alloc>
1616
</resource>
1717

18-
<function name="fopen"> <noreturn>false</noreturn> </function>
19-
<function name="fclose"> <noreturn>false</noreturn> </function>
20-
<function name="fflush"> <noreturn>false</noreturn> <leak-ignore/> </function>
21-
18+
<function name="fopen"> <noreturn>false</noreturn> <arg nr="1"><not-null/><not-uninit/></arg><arg nr="2"><not-null/><not-uninit/></arg></function>
19+
<function name="fclose"> <noreturn>false</noreturn> <arg nr="1"><not-null/><not-uninit/></arg></function>
20+
<function name="fflush"> <noreturn>false</noreturn> <leak-ignore/> <arg nr="1"><not-uninit/></arg></function>
21+
<function name="fgetc"> <noreturn>false</noreturn> <leak-ignore/> <arg nr="1"><not-null/><not-uninit/></arg></function>
22+
<function name="fgetpos"> <noreturn>false</noreturn> <leak-ignore/> <arg nr="1"><not-null/><not-uninit/></arg><arg nr="2"><not-null/><not-uninit/></arg></function>
23+
<function name="fgets">
24+
<noreturn>false</noreturn>
25+
<leak-ignore/>
26+
<arg nr="1"><not-null/></arg>
27+
<arg nr="2"><not-uninit/><not-bool/><valid>0-</valid></arg>
28+
<arg nr="3"><not-null/><not-uninit/></arg>
29+
</function>
30+
<function name="fsetpos"> <noreturn>false</noreturn> <leak-ignore/> <arg nr="1"><not-null/><not-uninit/></arg><arg nr="2"><not-null/><not-uninit/></arg></function>
31+
2232
<function name="isalnum"> <noreturn>false</noreturn> <leak-ignore/> <arg nr="1"><valid>0-255</valid></arg> </function>
2333
<function name="isalpha"> <noreturn>false</noreturn> <leak-ignore/> <arg nr="1"><valid>0-255</valid></arg> </function>
2434
<function name="isblank"> <noreturn>false</noreturn> <leak-ignore/> <arg nr="1"><valid>0-255</valid></arg> </function>
@@ -54,7 +64,7 @@
5464
<function name="strerror"> <noreturn>false</noreturn> <leak-ignore/></function>
5565
<function name="strcspn"> <noreturn>false</noreturn> <leak-ignore/> <arg nr="1"><not-null/><not-uninit/></arg> <arg nr="2"><not-null/><not-uninit/></arg> </function>
5666
<function name="strcoll"> <noreturn>false</noreturn> <leak-ignore/> <arg nr="1"><not-null/><not-uninit/></arg> <arg nr="2"><not-null/><not-uninit/></arg> </function>
57-
67+
5868
<function name="strtol"> <leak-ignore/> <arg nr="1"><not-null/><not-uninit/></arg> <arg nr="3"><valid>0,2-36</valid></arg> </function>
5969
<function name="strtoll"> <leak-ignore/> <arg nr="1"><not-null/><not-uninit/></arg> <arg nr="3"><valid>0,2-36</valid></arg> </function>
6070
<function name="strtoul"> <leak-ignore/> <arg nr="1"><not-null/><not-uninit/></arg> <arg nr="3"><valid>0,2-36</valid></arg> </function>
@@ -64,6 +74,10 @@
6474
<function name="wcstoul"> <leak-ignore/> <arg nr="3"><valid>0,2-36</valid></arg> </function>
6575
<function name="wcstoull"> <leak-ignore/> <arg nr="3"><valid>0,2-36</valid></arg> </function>
6676

77+
78+
<function name="clearerr"> <noreturn>false</noreturn> <arg nr="1"><not-null/><not-uninit/></arg></function>
79+
<function name="feof"> <noreturn>false</noreturn> <arg nr="1"><not-null/><not-uninit/></arg></function>
80+
<function name="ferror"> <noreturn>false</noreturn> <arg nr="1"><not-null/><not-uninit/></arg></function>
6781
<function name="printf"> <noreturn>false</noreturn> <formatstr/> <arg nr="1"><formatstr/></arg> <arg nr="any"><not-uninit/></arg> </function>
6882
<function name="wprintf"> <noreturn>false</noreturn> <formatstr/> <arg nr="1"><formatstr/></arg> </function>
6983
<function name="sprintf"> <noreturn>false</noreturn> <formatstr/> <arg nr="2"><formatstr/></arg> </function>

cli/cppcheckexecutor.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,7 @@ static const Signaltype listofsignals[] = {
201201
};
202202

203203
/**
204-
* Simple helper function:
204+
* Simple helper function:
205205
* \return size of array
206206
* */
207207
template<typename T, int size>

test/testnullpointer.cpp

Lines changed: 40 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2396,54 +2396,77 @@ class TestNullPointer : public TestFixture {
23962396
const char errpq[] = "[test.cpp:1] -> [test.cpp:1]: (warning) Possible null pointer dereference: p - otherwise it is redundant to check it against null.\n"
23972397
"[test.cpp:1] -> [test.cpp:1]: (warning) Possible null pointer dereference: q - otherwise it is redundant to check it against null.\n";
23982398

2399-
// str..
2400-
check("void f(char*p){ strchr (p,c);if(!p){}}");
2399+
check("void f(FILE *p){ clearerr (p);if(!p){}}");
24012400
ASSERT_EQUALS(errp,errout.str());
24022401

2403-
check("void f(char*p){ strdup (p);if(!p){}}");
2402+
check("void f(FILE *p){ feof (p);if(!p){}}");
24042403
ASSERT_EQUALS(errp,errout.str());
24052404

2406-
check("void f(char*p){ strlen (p);if(!p){}}");
2405+
check("void f(FILE *p){ fgetc (p);if(!p){}}");
24072406
ASSERT_EQUALS(errp,errout.str());
24082407

2409-
check("void f(char*p,char*q){ strcpy (p,q);if(!p||!q){}}");
2408+
check("void f(FILE *p){ fclose (p);if(!p){}}");
2409+
ASSERT_EQUALS(errp,errout.str());
2410+
2411+
check("void f(FILE *p){ ferror (p);if(!p){}}");
2412+
ASSERT_EQUALS(errp,errout.str());
2413+
2414+
check("void f(char * p,char * q){ fopen (p,q);if(!p||!q){}}");
2415+
ASSERT_EQUALS(errpq,errout.str());
2416+
2417+
check("void f(FILE * p,fpos_t * q){ fgetpos (p,q);if(!p||!q){}}");
2418+
ASSERT_EQUALS(errpq,errout.str());
2419+
2420+
check("void f(FILE * p,fpos_t * q){ fsetpos (p,q);if(!p||!q){}}");
2421+
ASSERT_EQUALS(errpq,errout.str());
2422+
2423+
check("void f(char * p){ strchr (p,c);if(!p){}}");
2424+
ASSERT_EQUALS(errp,errout.str());
2425+
2426+
check("void f(char * p){ strdup (p);if(!p){}}");
2427+
ASSERT_EQUALS(errp,errout.str());
2428+
2429+
check("void f(char * p){ strlen (p);if(!p){}}");
2430+
ASSERT_EQUALS(errp,errout.str());
2431+
2432+
check("void f(char * p,char * q){ strcpy (p,q);if(!p||!q){}}");
24102433
ASSERT_EQUALS(errpq,errout.str());
24112434

2412-
check("void f(char*p,char*q){ strspn (p,q);if(!p||!q){}}");
2435+
check("void f(char * p,char * q){ strspn (p,q);if(!p||!q){}}");
24132436
ASSERT_EQUALS(errpq,errout.str());
24142437

2415-
check("void f(char*p,char*q){ strcspn (p,q);if(!p||!q){}}");
2438+
check("void f(char * p,char * q){ strcspn (p,q);if(!p||!q){}}");
24162439
ASSERT_EQUALS(errpq,errout.str());
24172440

2418-
check("void f(char*p,char*q){ strcoll (p,q);if(!p||!q){}}");
2441+
check("void f(char * p,char * q){ strcoll (p,q);if(!p||!q){}}");
24192442
ASSERT_EQUALS(errpq,errout.str());
24202443

2421-
check("void f(char*p,char*q){ strcat (p,q);if(!p||!q){}}");
2444+
check("void f(char * p,char * q){ strcat (p,q);if(!p||!q){}}");
24222445
ASSERT_EQUALS(errpq,errout.str());
24232446

2424-
check("void f(char*p,char*q){ strcmp (p,q);if(!p||!q){}}");
2447+
check("void f(char * p,char * q){ strcmp (p,q);if(!p||!q){}}");
24252448
ASSERT_EQUALS(errpq,errout.str());
24262449

2427-
check("void f(char*p,char*q){ strncpy (p,q,1);if(!p||!q){}}");
2450+
check("void f(char * p,char * q){ strncpy (p,q,1);if(!p||!q){}}");
24282451
ASSERT_EQUALS(errpq,errout.str());
24292452

2430-
check("void f(char*p,char*q){ strncat (p,q,1);if(!p||!q){}}");
2453+
check("void f(char * p,char * q){ strncat (p,q,1);if(!p||!q){}}");
24312454
ASSERT_EQUALS(errpq,errout.str());
24322455

2433-
check("void f(char*p,char*q){ strncmp (p,q,1);if(!p||!q){}}");
2456+
check("void f(char * p,char * q){ strncmp (p,q,1);if(!p||!q){}}");
24342457
ASSERT_EQUALS(errpq,errout.str());
24352458

2436-
check("void f(char*p,char*q){ strstr (p,q);if(!p||!q){}}");
2459+
check("void f(char * p,char * q){ strstr (p,q);if(!p||!q){}}");
24372460
ASSERT_EQUALS(errpq,errout.str());
24382461

24392462
// strtol etc
2440-
check("void f(char*p,char*q){ strtoul (p,q,0);if(!p){}}");
2463+
check("void f(char * p,char * q){ strtoul (p,q,0);if(!p){}}");
24412464
ASSERT_EQUALS(errp,errout.str());
24422465

2443-
check("void f(char*p,char*q){ strtoull (p,q,0);if(!p){}}");
2466+
check("void f(char * p,char * q){ strtoull (p,q,0);if(!p){}}");
24442467
ASSERT_EQUALS(errp,errout.str());
24452468

2446-
check("void f(char*p,char*q){ strtol (p,q,0);if(!p){}}");
2469+
check("void f(char * p,char * q){ strtol (p,q,0);if(!p){}}");
24472470
ASSERT_EQUALS(errp,errout.str());
24482471
}
24492472
};

test/testuninitvar.cpp

Lines changed: 159 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,9 @@ class TestUninitVar : public TestFixture {
6767
TEST_CASE(uninitvar2_malloc); // malloc returns uninitialized data
6868

6969
TEST_CASE(syntax_error); // Ticket #5073
70+
71+
// Test that std.cfg is configured correctly
72+
TEST_CASE(stdcfg);
7073
}
7174

7275
void checkUninitVar(const char code[], const char filename[] = "test.cpp") {
@@ -3423,6 +3426,162 @@ class TestUninitVar : public TestFixture {
34233426
"}", "test.cpp", /*verify=*/true, /*debugwarnings=*/true);
34243427
ASSERT_EQUALS("[test.cpp:6]: (debug) assertion failed '} while ('\n", errout.str());
34253428
}
3429+
3430+
// Test that std.cfg is configured correctly
3431+
void stdcfg() {
3432+
// clearerr
3433+
checkUninitVar("void f() {\n"
3434+
" FILE * pFile;\n"
3435+
" clearerr (pFile);\n"
3436+
"}");
3437+
ASSERT_EQUALS("[test.cpp:3]: (error) Uninitialized variable: pFile\n", errout.str());
3438+
3439+
checkUninitVar("void f(FILE * pFile) {\n"
3440+
" clearerr (pFile);\n"
3441+
"}");
3442+
ASSERT_EQUALS("", errout.str());
3443+
3444+
// fclose
3445+
checkUninitVar("void f() {\n"
3446+
" FILE * pFile;\n"
3447+
" fclose (pFile);\n"
3448+
"}");
3449+
ASSERT_EQUALS("[test.cpp:3]: (error) Uninitialized variable: pFile\n", errout.str());
3450+
3451+
checkUninitVar("void f(FILE * pFile) {\n"
3452+
" fclose (pFile);\n"
3453+
"}");
3454+
ASSERT_EQUALS("", errout.str());
3455+
3456+
// fopen
3457+
checkUninitVar("void f() {\n"
3458+
" char * filename;\n"
3459+
" fopen (filename, \"w\");\n"
3460+
"}");
3461+
ASSERT_EQUALS("[test.cpp:3]: (error) Uninitialized variable: filename\n", errout.str());
3462+
3463+
checkUninitVar("void f() {\n"
3464+
" char * filename;\n"
3465+
" char * mode;\n"
3466+
" fopen (filename, mode);\n"
3467+
"}");
3468+
ASSERT_EQUALS("[test.cpp:4]: (error) Uninitialized variable: filename\n"
3469+
"[test.cpp:4]: (error) Uninitialized variable: mode\n", errout.str());
3470+
3471+
checkUninitVar("void f(FILE * name, char *mode) {\n"
3472+
" fopen (name, mode);\n"
3473+
"}");
3474+
ASSERT_EQUALS("", errout.str());
3475+
3476+
// feof
3477+
checkUninitVar("void f() {\n"
3478+
" FILE * pFile;\n"
3479+
" feof (pFile);\n"
3480+
"}");
3481+
ASSERT_EQUALS("[test.cpp:3]: (error) Uninitialized variable: pFile\n", errout.str());
3482+
3483+
checkUninitVar("void f(FILE * pFile) {\n"
3484+
" feof (pFile);\n"
3485+
"}");
3486+
ASSERT_EQUALS("", errout.str());
3487+
3488+
// ferror
3489+
checkUninitVar("void f() {\n"
3490+
" FILE * pFile;\n"
3491+
" ferror (pFile);\n"
3492+
"}");
3493+
ASSERT_EQUALS("[test.cpp:3]: (error) Uninitialized variable: pFile\n", errout.str());
3494+
3495+
checkUninitVar("void f(FILE * pFile) {\n"
3496+
" ferror (pFile);\n"
3497+
"}");
3498+
ASSERT_EQUALS("", errout.str());
3499+
3500+
// fflush
3501+
checkUninitVar("void f() {\n"
3502+
" FILE * pFile;\n"
3503+
" fflush (pFile);\n"
3504+
"}");
3505+
ASSERT_EQUALS("[test.cpp:3]: (error) Uninitialized variable: pFile\n", errout.str());
3506+
3507+
checkUninitVar("void f(FILE * pFile) {\n"
3508+
" fflush (pFile);\n"
3509+
"}");
3510+
ASSERT_EQUALS("", errout.str());
3511+
3512+
// fgetc
3513+
checkUninitVar("void f() {\n"
3514+
" FILE * pFile;\n"
3515+
" fgetc (pFile);\n"
3516+
"}");
3517+
ASSERT_EQUALS("[test.cpp:3]: (error) Uninitialized variable: pFile\n", errout.str());
3518+
3519+
checkUninitVar("void f(FILE * pFile) {\n"
3520+
" fgetc (pFile);\n"
3521+
"}");
3522+
ASSERT_EQUALS("", errout.str());
3523+
3524+
3525+
// fgetpos
3526+
checkUninitVar("void f() {\n"
3527+
" FILE * f;\n"
3528+
" fpos_t * p;\n"
3529+
" fgetpos (f, p);\n"
3530+
"}");
3531+
ASSERT_EQUALS("[test.cpp:4]: (error) Uninitialized variable: f\n"
3532+
"[test.cpp:4]: (error) Uninitialized variable: p\n", errout.str());
3533+
3534+
checkUninitVar("void f(FILE * f) {\n"
3535+
" fpos_t p;"
3536+
" fgetpos (f, &p);\n"
3537+
"}");
3538+
ASSERT_EQUALS("", errout.str());
3539+
3540+
checkUninitVar("void f(FILE * f, fpos_t *p) {\n"
3541+
" fgetpos (f, p);\n"
3542+
"}");
3543+
ASSERT_EQUALS("", errout.str());
3544+
3545+
// fsetpos
3546+
checkUninitVar("void f() {\n"
3547+
" FILE * f;\n"
3548+
" fpos_t * p;\n"
3549+
" fsetpos (f, p);\n"
3550+
"}");
3551+
ASSERT_EQUALS("[test.cpp:4]: (error) Uninitialized variable: f\n"
3552+
"[test.cpp:4]: (error) Uninitialized variable: p\n", errout.str());
3553+
3554+
checkUninitVar("void f(FILE * f) {\n"
3555+
" fpos_t *p;"
3556+
" fsetpos (f, p);\n"
3557+
"}");
3558+
ASSERT_EQUALS("[test.cpp:2]: (error) Uninitialized variable: p\n", errout.str());
3559+
3560+
checkUninitVar("void f(FILE * f, fpos_t *p) {\n"
3561+
" fsetpos (f, p);\n"
3562+
"}");
3563+
ASSERT_EQUALS("", errout.str());
3564+
3565+
// fgets
3566+
checkUninitVar("void f(FILE *f) {\n"
3567+
" char *s;\n"
3568+
" int n;\n"
3569+
" fgets (s, n, f);\n"
3570+
"}");
3571+
ASSERT_EQUALS("[test.cpp:4]: (error) Uninitialized variable: n\n"
3572+
"[test.cpp:4]: (error) Uninitialized variable: s\n", errout.str());
3573+
3574+
checkUninitVar("void f(char * s, int n) {\n"
3575+
" FILE *f;\n"
3576+
" fgets (s, n, f);\n"
3577+
"}");
3578+
TODO_ASSERT_EQUALS("[test.cpp:3]: (error) Uninitialized variable: f\n","", errout.str());
3579+
3580+
checkUninitVar("void f(char * s, int n, FILE *f) {\n"
3581+
" fgets (s, n, f);\n"
3582+
"}");
3583+
ASSERT_EQUALS("", errout.str());
3584+
}
34263585
};
34273586

34283587
REGISTER_TEST(TestUninitVar)

0 commit comments

Comments
 (0)