Fix 11630 and 11620 lifetime issues (#4913)
This commit is contained in:
parent
e1a4a18528
commit
cd21f55cdf
|
@ -4813,8 +4813,15 @@ static void valueFlowLifetime(TokenList *tokenlist, SymbolDatabase* /*db*/, Erro
|
|||
// container lifetimes
|
||||
else if (astIsContainer(tok)) {
|
||||
Token * parent = astParentSkipParens(tok);
|
||||
if (!Token::Match(parent, ". %name% (") &&
|
||||
!Token::simpleMatch(parent, "("))
|
||||
if (!parent)
|
||||
continue;
|
||||
if (!Token::Match(parent, ". %name% (") && !Token::Match(parent->previous(), "%name% ("))
|
||||
continue;
|
||||
|
||||
// Skip if its a free function that doesnt yield an iterator to the container
|
||||
if (Token::Match(parent->previous(), "%name% (") &&
|
||||
!contains({Library::Container::Yield::START_ITERATOR, Library::Container::Yield::END_ITERATOR},
|
||||
astFunctionYield(parent->previous(), settings)))
|
||||
continue;
|
||||
|
||||
ValueFlow::Value master;
|
||||
|
|
|
@ -3901,6 +3901,14 @@ private:
|
|||
" std::map<std::string, int> m;\n"
|
||||
"};\n");
|
||||
ASSERT_EQUALS("", errout.str());
|
||||
|
||||
// #11628
|
||||
check("std::vector<int>* g();\n"
|
||||
"void f() {\n"
|
||||
" std::unique_ptr<std::vector<int>> p(g());\n"
|
||||
" if (!p) {}\n"
|
||||
"}\n");
|
||||
ASSERT_EQUALS("", errout.str());
|
||||
}
|
||||
|
||||
void danglingLifetimeBorrowedMembers()
|
||||
|
|
|
@ -5873,6 +5873,15 @@ private:
|
|||
ASSERT_EQUALS(
|
||||
"[test.cpp:4]: (performance) Ineffective call of function 'substr' because a prefix of the string is assigned to itself. Use resize() or pop_back() instead.\n",
|
||||
errout.str());
|
||||
|
||||
// #11630
|
||||
check("int main(int argc, const char* argv[]) {\n"
|
||||
" std::vector<std::string> args(argv + 1, argv + argc);\n"
|
||||
" args.push_back(\"-h\");\n"
|
||||
" args.front();\n"
|
||||
"}\n",
|
||||
true);
|
||||
ASSERT_EQUALS("", errout.str());
|
||||
}
|
||||
|
||||
void invalidContainerLoop() {
|
||||
|
|
Loading…
Reference in New Issue