* Partial fix for #10057 unused variable without assignment not detected * Add test for #9672
This commit is contained in:
parent
c54b3f4de0
commit
afef71f6b6
|
@ -2054,11 +2054,12 @@ void CheckOther::checkMisusedScopedObject()
|
||||||
const SymbolDatabase * const symbolDatabase = mTokenizer->getSymbolDatabase();
|
const SymbolDatabase * const symbolDatabase = mTokenizer->getSymbolDatabase();
|
||||||
for (const Scope * scope : symbolDatabase->functionScopes) {
|
for (const Scope * scope : symbolDatabase->functionScopes) {
|
||||||
for (const Token *tok = scope->bodyStart; tok && tok != scope->bodyEnd; tok = tok->next()) {
|
for (const Token *tok = scope->bodyStart; tok && tok != scope->bodyEnd; tok = tok->next()) {
|
||||||
if ((tok->next()->type() || (tok->next()->function() && tok->next()->function()->isConstructor())) // TODO: The rhs of || should be removed; It is a workaround for a symboldatabase bug
|
if ((tok->next()->type() || tok->next()->isStandardType() || (tok->next()->function() && tok->next()->function()->isConstructor())) // TODO: The rhs of || should be removed; It is a workaround for a symboldatabase bug
|
||||||
&& Token::Match(tok, "[;{}] %name% (")
|
&& Token::Match(tok, "[;{}] %name% (|{")
|
||||||
&& Token::Match(tok->linkAt(2), ") ; !!}")
|
&& Token::Match(tok->linkAt(2), ")|} ; !!}")
|
||||||
&& (!tok->next()->function() || // is not a function on this scope
|
&& (!tok->next()->function() || // is not a function on this scope
|
||||||
tok->next()->function()->isConstructor())) { // or is function in this scope and it's a ctor
|
tok->next()->function()->isConstructor()) // or is function in this scope and it's a ctor
|
||||||
|
&& (!tok->tokAt(2)->astOperand2() || isConstStatement(tok->tokAt(2)->astOperand2(), mTokenizer->isCPP()))) {
|
||||||
tok = tok->next();
|
tok = tok->next();
|
||||||
misusedScopeObjectError(tok, tok->str());
|
misusedScopeObjectError(tok, tok->str());
|
||||||
tok = tok->next();
|
tok = tok->next();
|
||||||
|
|
|
@ -15,6 +15,7 @@
|
||||||
#include <memory.h>
|
#include <memory.h>
|
||||||
#include <mbstring.h>
|
#include <mbstring.h>
|
||||||
#include <wchar.h>
|
#include <wchar.h>
|
||||||
|
#include <atlstr.h>
|
||||||
|
|
||||||
int stringCompare_mbscmp(const unsigned char *string1, const unsigned char *string2)
|
int stringCompare_mbscmp(const unsigned char *string1, const unsigned char *string2)
|
||||||
{
|
{
|
||||||
|
@ -1102,3 +1103,11 @@ public:
|
||||||
IMPLEMENT_DYNAMIC(MyClass, CObject)
|
IMPLEMENT_DYNAMIC(MyClass, CObject)
|
||||||
IMPLEMENT_DYNCREATE(MyClass, CObject)
|
IMPLEMENT_DYNCREATE(MyClass, CObject)
|
||||||
IMPLEMENT_SERIAL(MyClass,CObject, 42)
|
IMPLEMENT_SERIAL(MyClass,CObject, 42)
|
||||||
|
|
||||||
|
void invalidPrintfArgType_StructMember(double d) { // #9672
|
||||||
|
typedef struct { CString st; } my_struct_t;
|
||||||
|
|
||||||
|
my_struct_t my_struct;
|
||||||
|
// cppcheck-suppress invalidPrintfArgType_sint
|
||||||
|
my_struct.st.Format("%d", d);
|
||||||
|
}
|
|
@ -139,6 +139,7 @@ private:
|
||||||
TEST_CASE(testMisusedScopeObjectDoesNotPickNestedClass);
|
TEST_CASE(testMisusedScopeObjectDoesNotPickNestedClass);
|
||||||
TEST_CASE(testMisusedScopeObjectInConstructor);
|
TEST_CASE(testMisusedScopeObjectInConstructor);
|
||||||
TEST_CASE(testMisusedScopeObjectNoCodeAfter);
|
TEST_CASE(testMisusedScopeObjectNoCodeAfter);
|
||||||
|
TEST_CASE(testMisusedScopeObjectStandardType);
|
||||||
TEST_CASE(trac2071);
|
TEST_CASE(trac2071);
|
||||||
TEST_CASE(trac2084);
|
TEST_CASE(trac2084);
|
||||||
TEST_CASE(trac3693);
|
TEST_CASE(trac3693);
|
||||||
|
@ -5031,6 +5032,26 @@ private:
|
||||||
ASSERT_EQUALS("", errout.str());
|
ASSERT_EQUALS("", errout.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void testMisusedScopeObjectStandardType() {
|
||||||
|
check("int g();\n"
|
||||||
|
"void f(int i) {\n"
|
||||||
|
" int();\n"
|
||||||
|
" int(0);\n"
|
||||||
|
" int( g() );\n" // don't warn
|
||||||
|
" int{};\n"
|
||||||
|
" int{ 0 };\n"
|
||||||
|
" int{ i };\n"
|
||||||
|
" int{ g() };\n" // don't warn
|
||||||
|
" g();\n"
|
||||||
|
"}\n", "test.cpp");
|
||||||
|
ASSERT_EQUALS("[test.cpp:3]: (style) Instance of 'int' object is destroyed immediately.\n"
|
||||||
|
"[test.cpp:4]: (style) Instance of 'int' object is destroyed immediately.\n"
|
||||||
|
"[test.cpp:6]: (style) Instance of 'int' object is destroyed immediately.\n"
|
||||||
|
"[test.cpp:7]: (style) Instance of 'int' object is destroyed immediately.\n"
|
||||||
|
"[test.cpp:8]: (style) Instance of 'int' object is destroyed immediately.\n",
|
||||||
|
errout.str());
|
||||||
|
}
|
||||||
|
|
||||||
void trac2084() {
|
void trac2084() {
|
||||||
check("void f()\n"
|
check("void f()\n"
|
||||||
"{\n"
|
"{\n"
|
||||||
|
|
Loading…
Reference in New Issue