Fix issue 9216: reset() method confusion (#2025)

* Fix issue 9216 with smart pointer reset

* Check for arrow
This commit is contained in:
Paul Fultz II 2019-07-23 15:45:58 -05:00 committed by Sebastian
parent 60b670babd
commit ab0fcc7640
2 changed files with 13 additions and 2 deletions

View File

@ -5090,7 +5090,7 @@ static void valueFlowSmartPointer(TokenList *tokenlist, ErrorLogger * errorLogge
values.push_back(v);
valueFlowForwardAssign(tok, var, values, false, true, tokenlist, errorLogger, settings);
}
} else if (Token::Match(tok, "%var% . reset (")) {
} else if (Token::Match(tok, "%var% . reset (") && tok->next()->originalName() != "->") {
if (Token::simpleMatch(tok->tokAt(3), "( )")) {
std::list<ValueFlow::Value> values;
ValueFlow::Value v(0);
@ -5106,7 +5106,7 @@ static void valueFlowSmartPointer(TokenList *tokenlist, ErrorLogger * errorLogge
const bool constValue = inTok->isNumber();
valueFlowForwardAssign(inTok, var, values, constValue, false, tokenlist, errorLogger, settings);
}
} else if (Token::Match(tok, "%var% . release ( )")) {
} else if (Token::Match(tok, "%var% . release ( )") && tok->next()->originalName() != "->") {
std::list<ValueFlow::Value> values;
ValueFlow::Value v(0);
v.setKnown();

View File

@ -2339,6 +2339,17 @@ private:
" p.reset(new const A*[n]);\n"
"}\n");
ASSERT_EQUALS("", errout.str());
// #9216
check("struct A {\n"
" void reset();\n"
" void f();\n"
"};\n"
"void g(std::unique_ptr<A> var) {\n"
" var->reset();\n"
" var->f();\n"
"}\n");
ASSERT_EQUALS("", errout.str());
}
void functioncall() { // #3443 - function calls