Improve check: uselessCallsConstructor (#4270)
This commit is contained in:
parent
22be5f29aa
commit
381c38b2f5
|
@ -2175,6 +2175,10 @@ void CheckStl::uselessCalls()
|
||||||
uselessCallsEmptyError(tok->next());
|
uselessCallsEmptyError(tok->next());
|
||||||
else if (Token::Match(tok, "[{};] std :: remove|remove_if|unique (") && tok->tokAt(5)->nextArgument())
|
else if (Token::Match(tok, "[{};] std :: remove|remove_if|unique (") && tok->tokAt(5)->nextArgument())
|
||||||
uselessCallsRemoveError(tok->next(), tok->strAt(3));
|
uselessCallsRemoveError(tok->next(), tok->strAt(3));
|
||||||
|
else if (printPerformance && Token::Match(tok, "%var% = { %var% . begin ( ) ,") &&
|
||||||
|
tok->valueType() && tok->valueType()->type == ValueType::CONTAINER && tok->varId() == tok->tokAt(3)->varId()) {
|
||||||
|
uselessCallsConstructorError(tok);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2223,6 +2227,12 @@ void CheckStl::uselessCallsSubstrError(const Token *tok, SubstrErrorType type)
|
||||||
reportError(tok, Severity::performance, "uselessCallsSubstr", msg, CWE398, Certainty::normal);
|
reportError(tok, Severity::performance, "uselessCallsSubstr", msg, CWE398, Certainty::normal);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CheckStl::uselessCallsConstructorError(const Token *tok)
|
||||||
|
{
|
||||||
|
const std::string msg = "Inefficient constructor call: container '" + tok->str() + "' is assigned a partial copy of itself. Use erase() or resize() instead.";
|
||||||
|
reportError(tok, Severity::performance, "uselessCallsConstructor", msg, CWE398, Certainty::normal);
|
||||||
|
}
|
||||||
|
|
||||||
void CheckStl::uselessCallsEmptyError(const Token *tok)
|
void CheckStl::uselessCallsEmptyError(const Token *tok)
|
||||||
{
|
{
|
||||||
reportError(tok, Severity::warning, "uselessCallsEmpty", "Ineffective call of function 'empty()'. Did you intend to call 'clear()' instead?", CWE398, Certainty::normal);
|
reportError(tok, Severity::warning, "uselessCallsEmpty", "Ineffective call of function 'empty()'. Did you intend to call 'clear()' instead?", CWE398, Certainty::normal);
|
||||||
|
|
|
@ -224,6 +224,7 @@ private:
|
||||||
void uselessCallsSubstrError(const Token* tok, SubstrErrorType type);
|
void uselessCallsSubstrError(const Token* tok, SubstrErrorType type);
|
||||||
void uselessCallsEmptyError(const Token* tok);
|
void uselessCallsEmptyError(const Token* tok);
|
||||||
void uselessCallsRemoveError(const Token* tok, const std::string& function);
|
void uselessCallsRemoveError(const Token* tok, const std::string& function);
|
||||||
|
void uselessCallsConstructorError(const Token* tok);
|
||||||
|
|
||||||
void dereferenceInvalidIteratorError(const Token* deref, const std::string& iterName);
|
void dereferenceInvalidIteratorError(const Token* deref, const std::string& iterName);
|
||||||
void dereferenceInvalidIteratorError(const Token* tok, const ValueFlow::Value *value, bool inconclusive);
|
void dereferenceInvalidIteratorError(const Token* tok, const ValueFlow::Value *value, bool inconclusive);
|
||||||
|
|
|
@ -4183,6 +4183,36 @@ private:
|
||||||
"}\n");
|
"}\n");
|
||||||
ASSERT_EQUALS("[test.cpp:2]: (performance) Ineffective call of function 'substr' because a prefix of the string is assigned to itself. Use replace() instead.\n",
|
ASSERT_EQUALS("[test.cpp:2]: (performance) Ineffective call of function 'substr' because a prefix of the string is assigned to itself. Use replace() instead.\n",
|
||||||
errout.str());
|
errout.str());
|
||||||
|
|
||||||
|
check("std::string f(std::string s, std::size_t end) {\n"
|
||||||
|
" s = { s.begin(), s.begin() + end };\n"
|
||||||
|
" return s;\n"
|
||||||
|
"}\n");
|
||||||
|
ASSERT_EQUALS("[test.cpp:2]: (performance) Inefficient constructor call: container 's' is assigned a partial copy of itself. Use erase() or resize() instead.\n",
|
||||||
|
errout.str());
|
||||||
|
|
||||||
|
check("std::list<int> f(std::list<int> l, std::size_t end) {\n"
|
||||||
|
" l = { l.begin(), l.begin() + end };\n"
|
||||||
|
" return l;\n"
|
||||||
|
"}\n");
|
||||||
|
ASSERT_EQUALS("[test.cpp:2]: (performance) Inefficient constructor call: container 'l' is assigned a partial copy of itself. Use erase() or resize() instead.\n",
|
||||||
|
errout.str());
|
||||||
|
|
||||||
|
check("std::string f(std::string s, std::size_t end) {\n"
|
||||||
|
" s = std::string{ s.begin(), s.begin() + end };\n"
|
||||||
|
" return s;\n"
|
||||||
|
"}\n");
|
||||||
|
TODO_ASSERT_EQUALS("[test.cpp:2]: (performance) Inefficient constructor call: container 's' is assigned a partial copy of itself. Use erase() or resize() instead.\n",
|
||||||
|
"",
|
||||||
|
errout.str());
|
||||||
|
|
||||||
|
check("std::string f(std::string s, std::size_t end) {\n"
|
||||||
|
" s = std::string(s.begin(), s.begin() + end);\n"
|
||||||
|
" return s;\n"
|
||||||
|
"}\n");
|
||||||
|
TODO_ASSERT_EQUALS("[test.cpp:2]: (performance) Inefficient constructor call: container 's' is assigned a partial copy of itself. Use erase() or resize() instead.\n",
|
||||||
|
"",
|
||||||
|
errout.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
void stabilityOfChecks() {
|
void stabilityOfChecks() {
|
||||||
|
|
Loading…
Reference in New Issue