Fixed #2179 (Segmentation fault in assignment operator)
This commit is contained in:
parent
c2bf3647a4
commit
36b03bdd3e
|
@ -102,7 +102,7 @@ static bool isFunction(const Token *tok, const Token **funcStart, const Token **
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CheckClass::addFunction(SpaceInfo **info, const Token **tok)
|
void CheckClass::addFunction(SpaceInfo **info, const Token **tok, const Token *argStart)
|
||||||
{
|
{
|
||||||
const Token *tok1 = (*tok)->tokAt(-2);
|
const Token *tok1 = (*tok)->tokAt(-2);
|
||||||
int count = 0;
|
int count = 0;
|
||||||
|
@ -180,6 +180,7 @@ void CheckClass::addFunction(SpaceInfo **info, const Token **tok)
|
||||||
{
|
{
|
||||||
func->hasBody = true;
|
func->hasBody = true;
|
||||||
func->token = (*tok)->next();
|
func->token = (*tok)->next();
|
||||||
|
func->arg = argStart;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (func->tokenDef->str() == (*tok)->str())
|
else if (func->tokenDef->str() == (*tok)->str())
|
||||||
|
@ -194,6 +195,7 @@ void CheckClass::addFunction(SpaceInfo **info, const Token **tok)
|
||||||
{
|
{
|
||||||
func->hasBody = true;
|
func->hasBody = true;
|
||||||
func->token = (*tok);
|
func->token = (*tok);
|
||||||
|
func->arg = argStart;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -203,6 +205,7 @@ void CheckClass::addFunction(SpaceInfo **info, const Token **tok)
|
||||||
// todo check for const
|
// todo check for const
|
||||||
func->hasBody = true;
|
func->hasBody = true;
|
||||||
func->token = (*tok);
|
func->token = (*tok);
|
||||||
|
func->arg = argStart;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -256,7 +259,7 @@ void CheckClass::addIfFunction(SpaceInfo **info, const Token **tok)
|
||||||
{
|
{
|
||||||
// class function
|
// class function
|
||||||
if ((*tok)->previous() && (*tok)->previous()->str() == "::")
|
if ((*tok)->previous() && (*tok)->previous()->str() == "::")
|
||||||
addFunction(info, tok);
|
addFunction(info, tok, argStart);
|
||||||
|
|
||||||
// regular function
|
// regular function
|
||||||
else
|
else
|
||||||
|
@ -271,7 +274,7 @@ void CheckClass::addIfFunction(SpaceInfo **info, const Token **tok)
|
||||||
|
|
||||||
// class function
|
// class function
|
||||||
if (tok1->previous()->str() == "::")
|
if (tok1->previous()->str() == "::")
|
||||||
addFunction(info, &tok1);
|
addFunction(info, &tok1, argStart);
|
||||||
|
|
||||||
// regular function
|
// regular function
|
||||||
else
|
else
|
||||||
|
@ -479,7 +482,7 @@ void CheckClass::createSymbolDatabase()
|
||||||
|
|
||||||
// nested class function?
|
// nested class function?
|
||||||
else if (tok->previous()->str() == "::" && isFunction(tok, &funcStart, &argStart))
|
else if (tok->previous()->str() == "::" && isFunction(tok, &funcStart, &argStart))
|
||||||
addFunction(&info, &tok);
|
addFunction(&info, &tok, argStart);
|
||||||
|
|
||||||
// friend class declaration?
|
// friend class declaration?
|
||||||
else if (Token::Match(tok, "friend class| %any% ;"))
|
else if (Token::Match(tok, "friend class| %any% ;"))
|
||||||
|
|
|
@ -279,7 +279,6 @@ private:
|
||||||
void addVar(const Token *token_, AccessControl access_, bool mutable_, bool static_, bool class_)
|
void addVar(const Token *token_, AccessControl access_, bool mutable_, bool static_, bool class_)
|
||||||
{
|
{
|
||||||
varlist.push_back(Var(token_, varlist.size(), access_, mutable_, static_, class_));
|
varlist.push_back(Var(token_, varlist.size(), access_, mutable_, static_, class_));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -316,11 +315,10 @@ private:
|
||||||
bool isBaseClassFunc(const Token *tok);
|
bool isBaseClassFunc(const Token *tok);
|
||||||
};
|
};
|
||||||
|
|
||||||
void addFunction(SpaceInfo **info, const Token **tok);
|
void addFunction(SpaceInfo **info, const Token **tok, const Token *argStart);
|
||||||
void addNewFunction(SpaceInfo **info, const Token **tok);
|
void addNewFunction(SpaceInfo **info, const Token **tok);
|
||||||
void addIfFunction(SpaceInfo **info, const Token **tok);
|
void addIfFunction(SpaceInfo **info, const Token **tok);
|
||||||
|
|
||||||
|
|
||||||
/** @brief Information about all namespaces/classes/structrues */
|
/** @brief Information about all namespaces/classes/structrues */
|
||||||
std::list<SpaceInfo *> spaceInfoList;
|
std::list<SpaceInfo *> spaceInfoList;
|
||||||
|
|
||||||
|
|
|
@ -104,6 +104,7 @@ private:
|
||||||
TEST_CASE(operatorEqToSelf5); // ticket # 1233
|
TEST_CASE(operatorEqToSelf5); // ticket # 1233
|
||||||
TEST_CASE(operatorEqToSelf6); // ticket # 1550
|
TEST_CASE(operatorEqToSelf6); // ticket # 1550
|
||||||
TEST_CASE(operatorEqToSelf7);
|
TEST_CASE(operatorEqToSelf7);
|
||||||
|
TEST_CASE(operatorEqToSelf8); // ticket #2179
|
||||||
TEST_CASE(memsetOnStruct);
|
TEST_CASE(memsetOnStruct);
|
||||||
TEST_CASE(memsetVector);
|
TEST_CASE(memsetVector);
|
||||||
TEST_CASE(memsetOnClass);
|
TEST_CASE(memsetOnClass);
|
||||||
|
@ -1234,6 +1235,26 @@ private:
|
||||||
ASSERT_EQUALS("", errout.str());
|
ASSERT_EQUALS("", errout.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void operatorEqToSelf8()
|
||||||
|
{
|
||||||
|
checkOpertorEqToSelf(
|
||||||
|
"class FMat\n"
|
||||||
|
"{\n"
|
||||||
|
"public:\n"
|
||||||
|
" FMat& copy(const FMat& rhs);\n"
|
||||||
|
" FMat& operator=(const FMat& in);\n"
|
||||||
|
"};\n"
|
||||||
|
"FMat& FMat::copy(const FMat& rhs)\n"
|
||||||
|
"{\n"
|
||||||
|
" return *this;\n"
|
||||||
|
"}\n"
|
||||||
|
"FMat& FMat::operator=(const FMat& in)\n"
|
||||||
|
"{\n"
|
||||||
|
" return copy(in);\n"
|
||||||
|
"}");
|
||||||
|
ASSERT_EQUALS("", errout.str());
|
||||||
|
}
|
||||||
|
|
||||||
// Check that base classes have virtual destructors
|
// Check that base classes have virtual destructors
|
||||||
void checkVirtualDestructor(const char code[])
|
void checkVirtualDestructor(const char code[])
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue