Skip to content

Commit

Permalink
Fix #9657 FP on missing va_end() after non-returning function
Browse files Browse the repository at this point in the history
  • Loading branch information
chrchr-github committed Jul 11, 2024
1 parent b9912e0 commit 5f09d53
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 2 deletions.
19 changes: 17 additions & 2 deletions lib/checkvaarg.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -144,9 +144,24 @@ void CheckVaarg::va_list_usage()
}
open = nopen;
tok = tok->linkAt(1);
} else if (Token::Match(tok, "throw|return"))
} else if (Token::Match(tok, "throw|return") || (Token::Match(tok, "%name% (") && mSettings->library.isnoreturn(tok))) {
exitOnEndOfStatement = true;
else if (tok->str() == "break") {
if (var->scope() == tok->scope()) {
if (const Token* tok3 = Token::findmatch(tok->next(), "%varid%|;", var->declarationId())) {
bool bail = tok3->str() == ";";
if (!bail) {
int argn{};
if (const Token* ftok = getTokenArgumentFunction(tok3, argn)) {
bail = ftok->str() != "va_arg";
}
}
if (bail) {
open = false;
break;
}
}
}
} else if (tok->str() == "break") {
tok = findNextTokenFromBreak(tok);
if (!tok)
return;
Expand Down
16 changes: 16 additions & 0 deletions test/testvaarg.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -309,6 +309,22 @@ class TestVaarg : public TestFixture {
"format_err:\n"
"}");
ASSERT_EQUALS("", errout_str());

// #9657
check("static void __attribute__((__noreturn__)) __attribute__((__format__(__printf__, 1, 0)))\n"
" notreturning(const char* fmt, va_list args) {\n"
" va_list args_copy;\n"
" va_copy(args_copy, args);\n"
" vprintf(fmt, args_copy);\n"
" va_end(args_copy);\n"
" exit(1);\n"
"}\n"
"static void check_noret_va_end(const char* fmt, ...) {\n"
" va_list args;\n"
" va_start(args, fmt);\n"
" notreturning(fmt, args);\n"
"}\n");
ASSERT_EQUALS("", errout_str());
}

void va_start_subsequentCalls() {
Expand Down

0 comments on commit 5f09d53

Please sign in to comment.