Skip to content

Commit be09361

Browse files
Refactor: Use enum class in checkio (danmar#3112)
1 parent 0338e99 commit be09361

File tree

1 file changed

+57
-57
lines changed

1 file changed

+57
-57
lines changed

lib/checkio.cpp

Lines changed: 57 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -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 };
9191
static 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

102102
struct 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

Comments
 (0)