Fixed #8064 (Taking the address of a moved variable is not accessing it)
This commit is contained in:
parent
e46691597e
commit
3f55707b30
|
@ -19,6 +19,7 @@
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
#include "checkother.h"
|
#include "checkother.h"
|
||||||
|
#include "checkuninitvar.h" // CheckUninitVar::isVariableUsage
|
||||||
|
|
||||||
#include "astutils.h"
|
#include "astutils.h"
|
||||||
#include "errorlogger.h"
|
#include "errorlogger.h"
|
||||||
|
@ -2772,6 +2773,7 @@ void CheckOther::checkAccessOfMovedVariable()
|
||||||
{
|
{
|
||||||
if (!mTokenizer->isCPP() || mSettings->standards.cpp < Standards::CPP11 || !mSettings->isEnabled(Settings::WARNING))
|
if (!mTokenizer->isCPP() || mSettings->standards.cpp < Standards::CPP11 || !mSettings->isEnabled(Settings::WARNING))
|
||||||
return;
|
return;
|
||||||
|
CheckUninitVar checkUninitVar(mTokenizer, mSettings, mErrorLogger);
|
||||||
const bool reportInconclusive = mSettings->inconclusive;
|
const bool reportInconclusive = mSettings->inconclusive;
|
||||||
const SymbolDatabase *symbolDatabase = mTokenizer->getSymbolDatabase();
|
const SymbolDatabase *symbolDatabase = mTokenizer->getSymbolDatabase();
|
||||||
for (const Scope * scope : symbolDatabase->functionScopes) {
|
for (const Scope * scope : symbolDatabase->functionScopes) {
|
||||||
|
@ -2797,7 +2799,7 @@ void CheckOther::checkAccessOfMovedVariable()
|
||||||
inconclusive = true;
|
inconclusive = true;
|
||||||
} else {
|
} else {
|
||||||
const bool isVariableChanged = isVariableChangedByFunctionCall(tok, mSettings, &inconclusive);
|
const bool isVariableChanged = isVariableChangedByFunctionCall(tok, mSettings, &inconclusive);
|
||||||
accessOfMoved = !isVariableChanged;
|
accessOfMoved = !isVariableChanged && checkUninitVar.isVariableUsage(tok, false, CheckUninitVar::NO_ALLOC);
|
||||||
if (inconclusive) {
|
if (inconclusive) {
|
||||||
accessOfMoved = !isMovedParameterAllowedForInconclusiveFunction(tok);
|
accessOfMoved = !isMovedParameterAllowedForInconclusiveFunction(tok);
|
||||||
if (accessOfMoved)
|
if (accessOfMoved)
|
||||||
|
|
|
@ -208,6 +208,7 @@ private:
|
||||||
TEST_CASE(moveAndReturn);
|
TEST_CASE(moveAndReturn);
|
||||||
TEST_CASE(moveAndClear);
|
TEST_CASE(moveAndClear);
|
||||||
TEST_CASE(movedPointer);
|
TEST_CASE(movedPointer);
|
||||||
|
TEST_CASE(moveAndAddressOf);
|
||||||
TEST_CASE(partiallyMoved);
|
TEST_CASE(partiallyMoved);
|
||||||
TEST_CASE(moveAndLambda);
|
TEST_CASE(moveAndLambda);
|
||||||
TEST_CASE(forwardAndUsed);
|
TEST_CASE(forwardAndUsed);
|
||||||
|
@ -7334,6 +7335,15 @@ private:
|
||||||
"[test.cpp:5]: (warning) Access of moved variable 'p'.\n", errout.str());
|
"[test.cpp:5]: (warning) Access of moved variable 'p'.\n", errout.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void moveAndAddressOf() {
|
||||||
|
check("void f() {\n"
|
||||||
|
" std::string s1 = x;\n"
|
||||||
|
" std::string s2 = std::move(s1);\n"
|
||||||
|
" p = &s1;\n"
|
||||||
|
"}");
|
||||||
|
ASSERT_EQUALS("", errout.str());
|
||||||
|
}
|
||||||
|
|
||||||
void partiallyMoved() {
|
void partiallyMoved() {
|
||||||
check("void f() {\n"
|
check("void f() {\n"
|
||||||
" A a;\n"
|
" A a;\n"
|
||||||
|
|
Loading…
Reference in New Issue