* Fix #10993 danglingTemporaryLifetime reported in two different locations for std::string_view usage * Missing include * Add test
This commit is contained in:
parent
07caf17eb3
commit
266174ddc4
|
@ -392,6 +392,13 @@ void CheckAutoVariables::errorUselessAssignmentPtrArg(const Token *tok)
|
||||||
"Assignment of function parameter has no effect outside the function. Did you forget dereferencing it?", CWE398, Certainty::normal);
|
"Assignment of function parameter has no effect outside the function. Did you forget dereferencing it?", CWE398, Certainty::normal);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool CheckAutoVariables::diag(const Token* tokvalue)
|
||||||
|
{
|
||||||
|
if (!tokvalue)
|
||||||
|
return true;
|
||||||
|
return !mDiagDanglingTemp.insert(tokvalue).second;
|
||||||
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
static bool isInScope(const Token * tok, const Scope * scope)
|
static bool isInScope(const Token * tok, const Scope * scope)
|
||||||
|
@ -603,7 +610,8 @@ void CheckAutoVariables::checkVarLifetimeScope(const Token * start, const Token
|
||||||
break;
|
break;
|
||||||
} else if (!tokvalue->variable() &&
|
} else if (!tokvalue->variable() &&
|
||||||
isDeadTemporary(mTokenizer->isCPP(), tokvalue, tok, &mSettings->library)) {
|
isDeadTemporary(mTokenizer->isCPP(), tokvalue, tok, &mSettings->library)) {
|
||||||
errorDanglingTemporaryLifetime(tok, &val, tokvalue);
|
if (!diag(tokvalue))
|
||||||
|
errorDanglingTemporaryLifetime(tok, &val, tokvalue);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,6 +27,7 @@
|
||||||
#include "errortypes.h"
|
#include "errortypes.h"
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
|
#include <set>
|
||||||
|
|
||||||
class Settings;
|
class Settings;
|
||||||
class Token;
|
class Token;
|
||||||
|
@ -127,6 +128,11 @@ private:
|
||||||
"- suspicious assignment of pointer argument\n"
|
"- suspicious assignment of pointer argument\n"
|
||||||
"- useless assignment of function argument\n";
|
"- useless assignment of function argument\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** returns true if tokvalue has already been diagnosed */
|
||||||
|
bool diag(const Token* tokvalue);
|
||||||
|
|
||||||
|
std::set<const Token*> mDiagDanglingTemp;
|
||||||
};
|
};
|
||||||
/// @}
|
/// @}
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
|
|
|
@ -2744,6 +2744,12 @@ private:
|
||||||
" return sv;\n"
|
" return sv;\n"
|
||||||
"}\n");
|
"}\n");
|
||||||
ASSERT_EQUALS("", errout.str());
|
ASSERT_EQUALS("", errout.str());
|
||||||
|
|
||||||
|
check("void f() {\n" // #10993
|
||||||
|
" std::string_view v = std::string();\n"
|
||||||
|
" v.data();\n"
|
||||||
|
"}\n");
|
||||||
|
ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:2] -> [test.cpp:3]: (error) Using object that is a temporary.\n", errout.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
void danglingLifetimeUniquePtr()
|
void danglingLifetimeUniquePtr()
|
||||||
|
|
Loading…
Reference in New Issue