@@ -87,27 +87,27 @@ void CheckIO::coutCerrMisusageError(const Token* tok, const std::string& streamN
8787// fopen("","r"); fwrite(); <- write to read-only file (or vice versa)
8888// fclose(); fread(); <- Use closed file
8989// ---------------------------------------------------------------------------
90- enum OpenMode { CLOSED, READ_MODE, WRITE_MODE, RW_MODE, UNKNOWN_OM };
90+ enum class OpenMode { CLOSED, READ_MODE, WRITE_MODE, RW_MODE, UNKNOWN_OM };
9191static OpenMode getMode (const std::string& str)
9292{
9393 if (str.find (' +' , 1 ) != std::string::npos)
94- return RW_MODE;
94+ return OpenMode:: RW_MODE;
9595 else if (str.find (' w' ) != std::string::npos || str.find (' a' ) != std::string::npos)
96- return WRITE_MODE;
96+ return OpenMode:: WRITE_MODE;
9797 else if (str.find (' r' ) != std::string::npos)
98- return READ_MODE;
99- return UNKNOWN_OM;
98+ return OpenMode:: READ_MODE;
99+ return OpenMode:: UNKNOWN_OM;
100100}
101101
102102struct Filepointer {
103103 OpenMode mode;
104104 nonneg int mode_indent;
105- enum Operation {NONE, UNIMPORTANT, READ, WRITE, POSITIONING, OPEN, CLOSE, UNKNOWN_OP} lastOperation;
105+ enum class Operation {NONE, UNIMPORTANT, READ, WRITE, POSITIONING, OPEN, CLOSE, UNKNOWN_OP} lastOperation;
106106 nonneg int op_indent;
107- enum AppendMode { UNKNOWN_AM, APPEND, APPEND_EX };
107+ enum class AppendMode { UNKNOWN_AM, APPEND, APPEND_EX };
108108 AppendMode append_mode;
109- explicit Filepointer (OpenMode mode_ = UNKNOWN_OM)
110- : mode(mode_), mode_indent(0 ), lastOperation(NONE), op_indent(0 ), append_mode(UNKNOWN_AM) {
109+ explicit Filepointer (OpenMode mode_ = OpenMode:: UNKNOWN_OM)
110+ : mode(mode_), mode_indent(0 ), lastOperation(Operation:: NONE), op_indent(0 ), append_mode(AppendMode:: UNKNOWN_AM) {
111111 }
112112};
113113
@@ -130,11 +130,11 @@ void CheckIO::checkFileUsage()
130130
131131 if (var->isLocal ()) {
132132 if (var->nameToken ()->strAt (1 ) == " (" ) // initialize by calling "ctor"
133- filepointers.insert (std::make_pair (var->declarationId (), Filepointer (UNKNOWN_OM)));
133+ filepointers.insert (std::make_pair (var->declarationId (), Filepointer (OpenMode:: UNKNOWN_OM)));
134134 else
135- filepointers.insert (std::make_pair (var->declarationId (), Filepointer (CLOSED)));
135+ filepointers.insert (std::make_pair (var->declarationId (), Filepointer (OpenMode:: CLOSED)));
136136 } else {
137- filepointers.insert (std::make_pair (var->declarationId (), Filepointer (UNKNOWN_OM)));
137+ filepointers.insert (std::make_pair (var->declarationId (), Filepointer (OpenMode:: UNKNOWN_OM)));
138138 // TODO: If all fopen calls we find open the file in the same type, we can set Filepointer::mode
139139 }
140140 }
@@ -149,32 +149,32 @@ void CheckIO::checkFileUsage()
149149 for (std::pair<const int , Filepointer>& filepointer : filepointers) {
150150 if (indent < filepointer.second .mode_indent ) {
151151 filepointer.second .mode_indent = 0 ;
152- filepointer.second .mode = UNKNOWN_OM;
152+ filepointer.second .mode = OpenMode:: UNKNOWN_OM;
153153 }
154154 if (indent < filepointer.second .op_indent ) {
155155 filepointer.second .op_indent = 0 ;
156- filepointer.second .lastOperation = Filepointer::UNKNOWN_OP;
156+ filepointer.second .lastOperation = Filepointer::Operation:: UNKNOWN_OP;
157157 }
158158 }
159159 } else if (tok->str () == " return" || tok->str () == " continue" || tok->str () == " break" || mSettings ->library .isnoreturn (tok)) { // Reset upon return, continue or break
160160 for (std::pair<const int , Filepointer>& filepointer : filepointers) {
161161 filepointer.second .mode_indent = 0 ;
162- filepointer.second .mode = UNKNOWN_OM;
162+ filepointer.second .mode = OpenMode:: UNKNOWN_OM;
163163 filepointer.second .op_indent = 0 ;
164- filepointer.second .lastOperation = Filepointer::UNKNOWN_OP;
164+ filepointer.second .lastOperation = Filepointer::Operation:: UNKNOWN_OP;
165165 }
166166 } else if (Token::Match (tok, " %var% =" ) &&
167167 (tok->strAt (2 ) != " fopen" && tok->strAt (2 ) != " freopen" && tok->strAt (2 ) != " tmpfile" &&
168168 (windows ? (tok->str () != " _wfopen" && tok->str () != " _wfreopen" ) : true ))) {
169169 std::map<int , Filepointer>::iterator i = filepointers.find (tok->varId ());
170170 if (i != filepointers.end ()) {
171- i->second .mode = UNKNOWN_OM;
172- i->second .lastOperation = Filepointer::UNKNOWN_OP;
171+ i->second .mode = OpenMode:: UNKNOWN_OM;
172+ i->second .lastOperation = Filepointer::Operation:: UNKNOWN_OP;
173173 }
174174 } else if (Token::Match (tok, " %name% (" ) && tok->previous () && (!tok->previous ()->isName () || Token::Match (tok->previous (), " return|throw" ))) {
175175 std::string mode;
176176 const Token* fileTok = nullptr ;
177- Filepointer::Operation operation = Filepointer::NONE;
177+ Filepointer::Operation operation = Filepointer::Operation:: NONE;
178178
179179 if ((tok->str () == " fopen" || tok->str () == " freopen" || tok->str () == " tmpfile" ||
180180 (windows && (tok->str () == " _wfopen" || tok->str () == " _wfreopen" ))) &&
@@ -186,13 +186,13 @@ void CheckIO::checkFileUsage()
186186 } else
187187 mode = " wb+" ;
188188 fileTok = tok->tokAt (-2 );
189- operation = Filepointer::OPEN;
189+ operation = Filepointer::Operation:: OPEN;
190190 } else if (windows && Token::Match (tok, " fopen_s|freopen_s|_wfopen_s|_wfreopen_s ( & %name%" )) {
191191 const Token* modeTok = tok->tokAt (2 )->nextArgument ()->nextArgument ();
192192 if (modeTok && modeTok->tokType () == Token::eString)
193193 mode = modeTok->strValue ();
194194 fileTok = tok->tokAt (3 );
195- operation = Filepointer::OPEN;
195+ operation = Filepointer::Operation:: OPEN;
196196 } else if ((tok->str () == " rewind" || tok->str () == " fseek" || tok->str () == " fsetpos" || tok->str () == " fflush" ) ||
197197 (windows && tok->str () == " _fseeki64" )) {
198198 fileTok = tok->tokAt (2 );
@@ -201,11 +201,11 @@ void CheckIO::checkFileUsage()
201201 fflushOnInputStreamError (tok, fileTok->str ());
202202 else {
203203 const Filepointer& f = filepointers[fileTok->varId ()];
204- if (f.mode == READ_MODE)
204+ if (f.mode == OpenMode:: READ_MODE)
205205 fflushOnInputStreamError (tok, fileTok->str ());
206206 }
207207 }
208- operation = Filepointer::POSITIONING;
208+ operation = Filepointer::Operation:: POSITIONING;
209209 } else if (tok->str () == " fgetc" || tok->str () == " fgetwc" ||
210210 tok->str () == " fgets" || tok->str () == " fgetws" || tok->str () == " fread" ||
211211 tok->str () == " fscanf" || tok->str () == " fwscanf" || tok->str () == " getc" ||
@@ -214,7 +214,7 @@ void CheckIO::checkFileUsage()
214214 fileTok = tok->tokAt (2 );
215215 else
216216 fileTok = tok->linkAt (1 )->previous ();
217- operation = Filepointer::READ;
217+ operation = Filepointer::Operation:: READ;
218218 } else if (tok->str () == " fputc" || tok->str () == " fputwc" ||
219219 tok->str () == " fputs" || tok->str () == " fputws" || tok->str () == " fwrite" ||
220220 tok->str () == " fprintf" || tok->str () == " fwprintf" || tok->str () == " putcc" ||
@@ -223,26 +223,26 @@ void CheckIO::checkFileUsage()
223223 fileTok = tok->tokAt (2 );
224224 else
225225 fileTok = tok->linkAt (1 )->previous ();
226- operation = Filepointer::WRITE;
226+ operation = Filepointer::Operation:: WRITE;
227227 } else if (tok->str () == " fclose" ) {
228228 fileTok = tok->tokAt (2 );
229- operation = Filepointer::CLOSE;
229+ operation = Filepointer::Operation:: CLOSE;
230230 } else if (whitelist.find (tok->str ()) != whitelist.end ()) {
231231 fileTok = tok->tokAt (2 );
232232 if ((tok->str () == " ungetc" || tok->str () == " ungetwc" ) && fileTok)
233233 fileTok = fileTok->nextArgument ();
234- operation = Filepointer::UNIMPORTANT;
234+ operation = Filepointer::Operation:: UNIMPORTANT;
235235 } else if (!Token::Match (tok, " if|for|while|catch|switch" ) && !mSettings ->library .isFunctionConst (tok->str (), true )) {
236236 const Token* const end2 = tok->linkAt (1 );
237237 if (scope->functionOf && scope->functionOf ->isClassOrStruct () && !scope->function ->isStatic () && ((tok->strAt (-1 ) != " ::" && tok->strAt (-1 ) != " ." ) || tok->strAt (-2 ) == " this" )) {
238238 if (!tok->function () || (tok->function ()->nestedIn && tok->function ()->nestedIn ->isClassOrStruct ())) {
239239 for (std::pair<const int , Filepointer>& filepointer : filepointers) {
240240 const Variable* var = symbolDatabase->getVariableFromVarId (filepointer.first );
241241 if (!var || !(var->isLocal () || var->isGlobal () || var->isStatic ())) {
242- filepointer.second .mode = UNKNOWN_OM;
242+ filepointer.second .mode = OpenMode:: UNKNOWN_OM;
243243 filepointer.second .mode_indent = 0 ;
244244 filepointer.second .op_indent = indent;
245- filepointer.second .lastOperation = Filepointer::UNKNOWN_OP;
245+ filepointer.second .lastOperation = Filepointer::Operation:: UNKNOWN_OP;
246246 }
247247 }
248248 continue ;
@@ -251,7 +251,7 @@ void CheckIO::checkFileUsage()
251251 for (const Token* tok2 = tok->tokAt (2 ); tok2 != end2; tok2 = tok2->next ()) {
252252 if (tok2->varId () && filepointers.find (tok2->varId ()) != filepointers.end ()) {
253253 fileTok = tok2;
254- operation = Filepointer::UNKNOWN_OP; // Assume that repositioning was last operation and that the file is opened now
254+ operation = Filepointer::Operation:: UNKNOWN_OP; // Assume that repositioning was last operation and that the file is opened now
255255 break ;
256256 }
257257 }
@@ -264,72 +264,72 @@ void CheckIO::checkFileUsage()
264264 continue ;
265265
266266 if (filepointers.find (fileTok->varId ()) == filepointers.end ()) { // function call indicates: Its a File
267- filepointers.insert (std::make_pair (fileTok->varId (), Filepointer (UNKNOWN_OM)));
267+ filepointers.insert (std::make_pair (fileTok->varId (), Filepointer (OpenMode:: UNKNOWN_OM)));
268268 }
269269 Filepointer& f = filepointers[fileTok->varId ()];
270270
271271 switch (operation) {
272- case Filepointer::OPEN:
272+ case Filepointer::Operation:: OPEN:
273273 f.mode = getMode (mode);
274274 if (mode.find (' a' ) != std::string::npos) {
275- if (f.mode == RW_MODE)
276- f.append_mode = Filepointer::APPEND_EX;
275+ if (f.mode == OpenMode:: RW_MODE)
276+ f.append_mode = Filepointer::AppendMode:: APPEND_EX;
277277 else
278- f.append_mode = Filepointer::APPEND;
278+ f.append_mode = Filepointer::AppendMode:: APPEND;
279279 } else
280- f.append_mode = Filepointer::UNKNOWN_AM;
280+ f.append_mode = Filepointer::AppendMode:: UNKNOWN_AM;
281281 f.mode_indent = indent;
282282 break ;
283- case Filepointer::POSITIONING:
284- if (f.mode == CLOSED)
283+ case Filepointer::Operation:: POSITIONING:
284+ if (f.mode == OpenMode:: CLOSED)
285285 useClosedFileError (tok);
286- else if (f.append_mode == Filepointer::APPEND && tok->str () != " fflush" && printWarnings)
286+ else if (f.append_mode == Filepointer::AppendMode:: APPEND && tok->str () != " fflush" && printWarnings)
287287 seekOnAppendedFileError (tok);
288288 break ;
289- case Filepointer::READ:
290- if (f.mode == CLOSED)
289+ case Filepointer::Operation:: READ:
290+ if (f.mode == OpenMode:: CLOSED)
291291 useClosedFileError (tok);
292- else if (f.mode == WRITE_MODE)
292+ else if (f.mode == OpenMode:: WRITE_MODE)
293293 readWriteOnlyFileError (tok);
294- else if (f.lastOperation == Filepointer::WRITE)
294+ else if (f.lastOperation == Filepointer::Operation:: WRITE)
295295 ioWithoutPositioningError (tok);
296296 break ;
297- case Filepointer::WRITE:
298- if (f.mode == CLOSED)
297+ case Filepointer::Operation:: WRITE:
298+ if (f.mode == OpenMode:: CLOSED)
299299 useClosedFileError (tok);
300- else if (f.mode == READ_MODE)
300+ else if (f.mode == OpenMode:: READ_MODE)
301301 writeReadOnlyFileError (tok);
302- else if (f.lastOperation == Filepointer::READ)
302+ else if (f.lastOperation == Filepointer::Operation:: READ)
303303 ioWithoutPositioningError (tok);
304304 break ;
305- case Filepointer::CLOSE:
306- if (f.mode == CLOSED)
305+ case Filepointer::Operation:: CLOSE:
306+ if (f.mode == OpenMode:: CLOSED)
307307 useClosedFileError (tok);
308308 else
309- f.mode = CLOSED;
309+ f.mode = OpenMode:: CLOSED;
310310 f.mode_indent = indent;
311311 break ;
312- case Filepointer::UNIMPORTANT:
313- if (f.mode == CLOSED)
312+ case Filepointer::Operation:: UNIMPORTANT:
313+ if (f.mode == OpenMode:: CLOSED)
314314 useClosedFileError (tok);
315315 break ;
316- case Filepointer::UNKNOWN_OP:
317- f.mode = UNKNOWN_OM;
316+ case Filepointer::Operation:: UNKNOWN_OP:
317+ f.mode = OpenMode:: UNKNOWN_OM;
318318 f.mode_indent = 0 ;
319319 break ;
320320 default :
321321 break ;
322322 }
323- if (operation != Filepointer::NONE && operation != Filepointer::UNIMPORTANT) {
323+ if (operation != Filepointer::Operation:: NONE && operation != Filepointer::Operation ::UNIMPORTANT) {
324324 f.op_indent = indent;
325325 f.lastOperation = operation;
326326 }
327327 }
328328 }
329329 for (std::pair<const int , Filepointer>& filepointer : filepointers) {
330330 filepointer.second .op_indent = 0 ;
331- filepointer.second .mode = UNKNOWN_OM;
332- filepointer.second .lastOperation = Filepointer::UNKNOWN_OP;
331+ filepointer.second .mode = OpenMode:: UNKNOWN_OM;
332+ filepointer.second .lastOperation = Filepointer::Operation:: UNKNOWN_OP;
333333 }
334334 }
335335}
0 commit comments