@@ -41,177 +41,6 @@ namespace {
4141 */
4242void CheckNullPointer::parseFunctionCall (const Token &tok, std::list<const Token *> &var, const Library *library, unsigned char value)
4343{
44- // standard functions that dereference first parameter..
45- static std::set<std::string> functionNames1_all; // used no matter what 'value' is
46- static std::set<std::string> functionNames1_nullptr; // used only when 'value' is 0
47- static std::set<std::string> functionNames1_uninit; // used only when 'value' is non-zero
48- if (functionNames1_all.empty ()) {
49- // cstdlib
50- functionNames1_all.insert (" atoi" );
51- functionNames1_all.insert (" atof" );
52- functionNames1_all.insert (" atol" );
53- functionNames1_all.insert (" qsort" );
54- functionNames1_all.insert (" strtof" );
55- functionNames1_all.insert (" strtod" );
56- functionNames1_all.insert (" strtol" );
57- functionNames1_all.insert (" strtoul" );
58- functionNames1_all.insert (" strtold" );
59- functionNames1_all.insert (" strtoll" );
60- functionNames1_all.insert (" strtoull" );
61- functionNames1_all.insert (" wcstof" );
62- functionNames1_all.insert (" wcstod" );
63- functionNames1_all.insert (" wcstol" );
64- functionNames1_all.insert (" wcstoul" );
65- functionNames1_all.insert (" wcstold" );
66- functionNames1_all.insert (" wcstoll" );
67- functionNames1_all.insert (" wcstoull" );
68- // cstring
69- functionNames1_all.insert (" strcat" );
70- functionNames1_all.insert (" strncat" );
71- functionNames1_all.insert (" strcoll" );
72- functionNames1_all.insert (" strchr" );
73- functionNames1_all.insert (" strrchr" );
74- functionNames1_all.insert (" strcmp" );
75- functionNames1_all.insert (" strncmp" );
76- functionNames1_all.insert (" strcspn" );
77- functionNames1_all.insert (" strdup" );
78- functionNames1_all.insert (" strndup" );
79- functionNames1_all.insert (" strpbrk" );
80- functionNames1_all.insert (" strlen" );
81- functionNames1_all.insert (" strspn" );
82- functionNames1_all.insert (" strstr" );
83- functionNames1_all.insert (" wcscat" );
84- functionNames1_all.insert (" wcsncat" );
85- functionNames1_all.insert (" wcscoll" );
86- functionNames1_all.insert (" wcschr" );
87- functionNames1_all.insert (" wcsrchr" );
88- functionNames1_all.insert (" wcscmp" );
89- functionNames1_all.insert (" wcsncmp" );
90- functionNames1_all.insert (" wcscspn" );
91- functionNames1_all.insert (" wcsdup" );
92- functionNames1_all.insert (" wcsndup" );
93- functionNames1_all.insert (" wcspbrk" );
94- functionNames1_all.insert (" wcslen" );
95- functionNames1_all.insert (" wcsspn" );
96- functionNames1_all.insert (" wcsstr" );
97- // cstdio
98- functionNames1_all.insert (" fclose" );
99- functionNames1_all.insert (" feof" );
100- functionNames1_all.insert (" fwrite" );
101- functionNames1_all.insert (" fseek" );
102- functionNames1_all.insert (" ftell" );
103- functionNames1_all.insert (" fputs" );
104- functionNames1_all.insert (" fputws" );
105- functionNames1_all.insert (" ferror" );
106- functionNames1_all.insert (" fgetc" );
107- functionNames1_all.insert (" fgetwc" );
108- functionNames1_all.insert (" fgetpos" );
109- functionNames1_all.insert (" fsetpos" );
110- functionNames1_all.insert (" fscanf" );
111- functionNames1_all.insert (" fprintf" );
112- functionNames1_all.insert (" fwscanf" );
113- functionNames1_all.insert (" fwprintf" );
114- functionNames1_all.insert (" fopen" );
115- functionNames1_all.insert (" rewind" );
116- functionNames1_all.insert (" printf" );
117- functionNames1_all.insert (" wprintf" );
118- functionNames1_all.insert (" scanf" );
119- functionNames1_all.insert (" wscanf" );
120- functionNames1_all.insert (" fscanf" );
121- functionNames1_all.insert (" sscanf" );
122- functionNames1_all.insert (" fwscanf" );
123- functionNames1_all.insert (" swscanf" );
124- functionNames1_all.insert (" setbuf" );
125- functionNames1_all.insert (" setvbuf" );
126- functionNames1_all.insert (" rename" );
127- functionNames1_all.insert (" remove" );
128- functionNames1_all.insert (" puts" );
129- functionNames1_all.insert (" getc" );
130- functionNames1_all.insert (" clearerr" );
131- // ctime
132- functionNames1_all.insert (" asctime" );
133- functionNames1_all.insert (" ctime" );
134- functionNames1_all.insert (" mktime" );
135-
136- functionNames1_nullptr.insert (" strcpy" );
137- functionNames1_nullptr.insert (" sprintf" );
138- functionNames1_nullptr.insert (" vsprintf" );
139- functionNames1_nullptr.insert (" vprintf" );
140- functionNames1_nullptr.insert (" fprintf" );
141- functionNames1_nullptr.insert (" vfprintf" );
142- functionNames1_nullptr.insert (" wcscpy" );
143- functionNames1_nullptr.insert (" swprintf" );
144- functionNames1_nullptr.insert (" vswprintf" );
145- functionNames1_nullptr.insert (" vwprintf" );
146- functionNames1_nullptr.insert (" fwprintf" );
147- functionNames1_nullptr.insert (" vfwprintf" );
148- functionNames1_nullptr.insert (" fread" );
149- functionNames1_nullptr.insert (" gets" );
150- functionNames1_nullptr.insert (" gmtime" );
151- functionNames1_nullptr.insert (" localtime" );
152- functionNames1_nullptr.insert (" strftime" );
153-
154- functionNames1_uninit.insert (" itoa" ); // value to convert
155- functionNames1_uninit.insert (" perror" );
156- functionNames1_uninit.insert (" fflush" );
157- functionNames1_uninit.insert (" freopen" );
158- }
159-
160- // standard functions that dereference second parameter..
161- static std::set<std::string> functionNames2_all; // used no matter what 'value' is
162- static std::set<std::string> functionNames2_nullptr; // used only if 'value' is 0
163- if (functionNames2_all.empty ()) {
164- functionNames2_all.insert (" mbstowcs" );
165- functionNames2_all.insert (" wcstombs" );
166- functionNames2_all.insert (" strcat" );
167- functionNames2_all.insert (" strncat" );
168- functionNames2_all.insert (" strcmp" );
169- functionNames2_all.insert (" strncmp" );
170- functionNames2_all.insert (" strcoll" );
171- functionNames2_all.insert (" strcpy" );
172- functionNames2_all.insert (" strcspn" );
173- functionNames2_all.insert (" strncpy" );
174- functionNames2_all.insert (" strpbrk" );
175- functionNames2_all.insert (" strspn" );
176- functionNames2_all.insert (" strstr" );
177- functionNames2_all.insert (" strxfrm" );
178- functionNames2_all.insert (" wcscat" );
179- functionNames2_all.insert (" wcsncat" );
180- functionNames2_all.insert (" wcscmp" );
181- functionNames2_all.insert (" wcsncmp" );
182- functionNames2_all.insert (" wcscoll" );
183- functionNames2_all.insert (" wcscpy" );
184- functionNames2_all.insert (" wcscspn" );
185- functionNames2_all.insert (" wcsncpy" );
186- functionNames2_all.insert (" wcspbrk" );
187- functionNames2_all.insert (" wcsspn" );
188- functionNames2_all.insert (" wcsstr" );
189- functionNames2_all.insert (" wcsxfrm" );
190- functionNames2_all.insert (" sprintf" );
191- functionNames2_all.insert (" fprintf" );
192- functionNames2_all.insert (" fscanf" );
193- functionNames2_all.insert (" sscanf" );
194- functionNames2_all.insert (" swprintf" );
195- functionNames2_all.insert (" fwprintf" );
196- functionNames2_all.insert (" fwscanf" );
197- functionNames2_all.insert (" swscanf" );
198- functionNames2_all.insert (" fputs" );
199- functionNames2_all.insert (" fputc" );
200- functionNames2_all.insert (" ungetc" );
201- functionNames2_all.insert (" fputws" );
202- functionNames2_all.insert (" fputwc" );
203- functionNames2_all.insert (" ungetwc" );
204- functionNames2_all.insert (" rename" );
205- functionNames2_all.insert (" putc" );
206- functionNames2_all.insert (" putwc" );
207- functionNames2_all.insert (" freopen" );
208-
209- functionNames2_nullptr.insert (" itoa" ); // destination buffer
210- functionNames2_nullptr.insert (" frexp" );
211- functionNames2_nullptr.insert (" modf" );
212- functionNames2_nullptr.insert (" fgetpos" );
213- }
214-
21544 if (Token::Match (&tok, " %var% ( )" ) || !tok.tokAt (2 ))
21645 return ;
21746
@@ -221,13 +50,7 @@ void CheckNullPointer::parseFunctionCall(const Token &tok, std::list<const Token
22150 // 1st parameter..
22251 if ((Token::Match (firstParam, " %var% ,|)" ) && firstParam->varId () > 0 ) ||
22352 (value == 0 && Token::Match (firstParam, " 0|NULL ,|)" ))) {
224- if (functionNames1_all.find (tok.str ()) != functionNames1_all.end ())
225- var.push_back (firstParam);
226- else if (value == 0 && functionNames1_nullptr.find (tok.str ()) != functionNames1_nullptr.end ())
227- var.push_back (firstParam);
228- else if (value != 0 && functionNames1_uninit.find (tok.str ()) != functionNames1_uninit.end ())
229- var.push_back (firstParam);
230- else if (value == 0 && Token::Match (&tok, " snprintf|vsnprintf|fnprintf|vfnprintf" ) && secondParam && secondParam->str () != " 0" ) // Only if length (second parameter) is not zero
53+ if (value == 0 && Token::Match (&tok, " snprintf|vsnprintf|fnprintf|vfnprintf" ) && secondParam && secondParam->str () != " 0" ) // Only if length (second parameter) is not zero
23154 var.push_back (firstParam);
23255 else if (value == 0 && library != nullptr && library->isnullargbad (tok.str (),1 ))
23356 var.push_back (firstParam);
@@ -237,11 +60,7 @@ void CheckNullPointer::parseFunctionCall(const Token &tok, std::list<const Token
23760
23861 // 2nd parameter..
23962 if ((value == 0 && Token::Match (secondParam, " 0|NULL ,|)" )) || (secondParam && secondParam->varId () > 0 && Token::Match (secondParam->next ()," [,)]" ))) {
240- if (functionNames2_all.find (tok.str ()) != functionNames2_all.end ())
241- var.push_back (secondParam);
242- else if (value == 0 && functionNames2_nullptr.find (tok.str ()) != functionNames2_nullptr.end ())
243- var.push_back (secondParam);
244- else if (value == 0 && library != nullptr && library->isnullargbad (tok.str (),2 ))
63+ if (value == 0 && library != nullptr && library->isnullargbad (tok.str (),2 ))
24564 var.push_back (secondParam);
24665 else if (value == 1 && library != nullptr && library->isuninitargbad (tok.str (),2 ))
24766 var.push_back (secondParam);
0 commit comments