Fixed #7837 (Field dereference triggers format string type warning)

This commit is contained in:
Daniel Marjamäki 2017-02-25 18:22:14 +01:00
parent 2e91858640
commit 26fc7abfac
2 changed files with 12 additions and 2 deletions

View File

@ -1400,7 +1400,7 @@ CheckIO::ArgumentInfo::ArgumentInfo(const Token * tok, const Settings *settings,
// TODO: This is a bailout so that old code is used in simple cases. Remove the old code and always use the AST type.
if (!Token::Match(tok, "%str%|%name% ,|)")) {
const Token *top = tok;
while (top->astParent() && top->astParent()->str() != "," && !(top->astParent()->str() == "(" && top->astParent()->astOperand2()))
while (top->astParent() && top->astParent()->str() != "," && top->astParent() != tok->previous())
top = top->astParent();
const ValueType *valuetype = top->argumentType();
if (valuetype && valuetype->type >= ValueType::Type::BOOL) {

View File

@ -2199,7 +2199,7 @@ private:
check("void foo() {\n"
" printf(\"%f %d\", static_cast<int>(1.0f), reinterpret_cast<const void *>(0));\n"
"}\n");
ASSERT_EQUALS("[test.cpp:2]: (warning) %f in format string (no. 1) requires 'double' but the argument type is 'int'.\n"
ASSERT_EQUALS("[test.cpp:2]: (warning) %f in format string (no. 1) requires 'double' but the argument type is 'signed int'.\n"
"[test.cpp:2]: (warning) %d in format string (no. 2) requires 'int' but the argument type is 'const void *'.\n", errout.str());
check("void foo() {\n"
@ -2354,6 +2354,16 @@ private:
"[test.cpp:2]: (warning) %hx in format string (no. 6) requires 'unsigned short' but the argument type is 'unsigned int'.\n"
"[test.cpp:2]: (warning) %hx in format string (no. 7) requires 'unsigned short' but the argument type is 'long'.\n"
"[test.cpp:2]: (warning) %hx in format string (no. 8) requires 'unsigned short' but the argument type is 'unsigned long'.\n", errout.str());
// #7837 - Use ValueType for function call
check("struct S {\n"
" double (* f)(double);\n"
"};\n"
"\n"
"void foo(struct S x) {\n"
" printf(\"%f\", x.f(4.0));\n"
"}");
ASSERT_EQUALS("", errout.str());
}
void testPosixPrintfScanfParameterPosition() { // #4900 - No support for parameters in format strings