Fixed #6182 (Format specifier check confused by ternary operator)

This commit is contained in:
Robert Reif 2014-09-24 16:45:06 +02:00 committed by Daniel Marjamäki
parent 7d85cb37ed
commit 1729ea6f0f
2 changed files with 12 additions and 2 deletions

View File

@ -1427,8 +1427,8 @@ CheckIO::ArgumentInfo::ArgumentInfo(const Token * tok, const Settings *settings)
tok1 = tok1->link(); tok1 = tok1->link();
// check for some common well known functions // check for some common well known functions
else if ((Token::Match(tok1->previous(), "%var% . size|empty|c_str ( )") && isStdContainer(tok1->previous())) || else if ((Token::Match(tok1->previous(), "%var% . size|empty|c_str ( ) [,)]") && isStdContainer(tok1->previous())) ||
(Token::Match(tok1->previous(), "] . size|empty|c_str ( )") && Token::Match(tok1->previous()->link()->previous(), "%var%") && isStdContainer(tok1->previous()->link()->previous()))) { (Token::Match(tok1->previous(), "] . size|empty|c_str ( ) [,)]") && Token::Match(tok1->previous()->link()->previous(), "%var%") && isStdContainer(tok1->previous()->link()->previous()))) {
tempToken = new Token(0); tempToken = new Token(0);
tempToken->fileIndex(tok1->fileIndex()); tempToken->fileIndex(tok1->fileIndex());
tempToken->linenr(tok1->linenr()); tempToken->linenr(tok1->linenr());

View File

@ -59,6 +59,8 @@ private:
TEST_CASE(testMicrosoftCStringFormatArguments); // ticket #4920 TEST_CASE(testMicrosoftCStringFormatArguments); // ticket #4920
TEST_CASE(testMicrosoftSecurePrintfArgument); TEST_CASE(testMicrosoftSecurePrintfArgument);
TEST_CASE(testMicrosoftSecureScanfArgument); TEST_CASE(testMicrosoftSecureScanfArgument);
TEST_CASE(testTernary); // ticket #6182
} }
void check(const char code[], bool inconclusive = false, bool portability = false, Settings::PlatformType platform = Settings::Unspecified) { void check(const char code[], bool inconclusive = false, bool portability = false, Settings::PlatformType platform = Settings::Unspecified) {
@ -3639,6 +3641,14 @@ private:
"}\n", false, false, Settings::Win32W); "}\n", false, false, Settings::Win32W);
ASSERT_EQUALS("", errout.str()); ASSERT_EQUALS("", errout.str());
} }
void testTernary() { // ticket #6182
check("void test(const std::string &val) {\n"
" printf(\"%s\n\", val.empty() ? \"I like to eat bananas\" : val.c_str());\n"
"}\n");
ASSERT_EQUALS("", errout.str());
}
}; };
REGISTER_TEST(TestIO) REGISTER_TEST(TestIO)