diff --git a/lib/checkio.cpp b/lib/checkio.cpp index 0e1d0395146..bf5d4bf8200 100644 --- a/lib/checkio.cpp +++ b/lib/checkio.cpp @@ -245,6 +245,19 @@ void CheckIO::checkFileUsage() } else if (tok->str() == "fclose") { fileTok = tok->tokAt(2); operation = Filepointer::Operation::CLOSE; + + // #1473 Check if fclose is in a while loop condition + const Token* tmp = tok->astParent(); + const Token* loopTok = nullptr; + while (tmp) { + if (Token::simpleMatch(tmp->previous(), "while (")) { + loopTok = tmp->previous(); + break; + } + tmp = tmp->astParent(); + } + if (loopTok) + useClosedFileError(tok); } else if (whitelist.find(tok->str()) != whitelist.end()) { fileTok = tok->tokAt(2); if ((tok->str() == "ungetc" || tok->str() == "ungetwc") && fileTok) diff --git a/test/testio.cpp b/test/testio.cpp index ec6a87a1e16..6c7ddbe244c 100644 --- a/test/testio.cpp +++ b/test/testio.cpp @@ -544,7 +544,7 @@ class TestIO : public TestFixture { " FILE *a = fopen(\"aa\", \"r\");\n" " while (fclose(a)) {}\n" "}"); - TODO_ASSERT_EQUALS("[test.cpp:3:5]: (error) Used file that is not opened. [useClosedFile]\n", "", errout_str()); + ASSERT_EQUALS("[test.cpp:3:12]: (error) Used file that is not opened. [useClosedFile]\n", errout_str()); // #6823 check("void foo() {\n"