Skip to content

Commit 812bc6b

Browse files
committed
CheckVaarg::va_list_usage(): Bailout when try{} block is encountered (cppcheck-opensource#6186)
1 parent 21c8511 commit 812bc6b

2 files changed

Lines changed: 16 additions & 1 deletion

File tree

lib/checkvaarg.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,10 @@ void CheckVaarg::va_list_usage()
114114
tok = tok->linkAt(1);
115115
} else if (Token::Match(tok, "throw|return"))
116116
exitOnEndOfStatement = true;
117-
else if (!open && tok->varId() == var->declarationId())
117+
else if (_tokenizer->isCPP() && tok->str() == "try") {
118+
open = false;
119+
break;
120+
} else if (!open && tok->varId() == var->declarationId())
118121
va_list_usedBeforeStartedError(tok, var->name());
119122
else if (exitOnEndOfStatement && tok->str() == ";")
120123
break;

test/testvaarg.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,18 @@ class TestVaarg : public TestFixture {
116116
"}");
117117
ASSERT_EQUALS("", errout.str());
118118

119+
// #6186
120+
check("void Format(char* szFormat, char (*szBuffer)[_Size], ...) {\n"
121+
" va_list arg_ptr;\n"
122+
" va_start(arg_ptr, szBuffer);\n"
123+
" try {\n"
124+
" throw sth;\n"
125+
" } catch(...) {\n"
126+
" va_end(arg_ptr);\n"
127+
" }\n"
128+
"}");
129+
ASSERT_EQUALS("", errout.str());
130+
119131
check("void Format(char* szFormat, char (*szBuffer)[_Size], ...) {\n"
120132
" va_list arg_ptr;\n"
121133
" va_start(arg_ptr, szBuffer);\n"

0 commit comments

Comments
 (0)