Skip to content

Commit 205af35

Browse files
committed
CheckClass: Fix endless recursion
1 parent 7658aa8 commit 205af35

2 files changed

Lines changed: 19 additions & 7 deletions

File tree

lib/checkclass.cpp

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -137,8 +137,7 @@ void CheckClass::constructors()
137137
}
138138

139139

140-
std::vector<Usage> usageList;
141-
createUsageList(usageList, scope);
140+
std::vector<Usage> usageList = createUsageList(scope);
142141

143142
for (const Function &func : scope->functionList) {
144143
if (!func.hasBody() || !(func.isConstructor() || func.type == Function::eOperatorEqual))
@@ -535,19 +534,33 @@ bool CheckClass::canNotMove(const Scope *scope)
535534
return constructor && !(publicAssign || publicCopy || publicMove);
536535
}
537536

538-
void CheckClass::createUsageList(std::vector<Usage>& usageList, const Scope *scope)
537+
static void getAllVariableMembers(const Scope *scope, std::vector<const Variable *>& varList, std::vector<const Scope *> &baseClasses)
539538
{
539+
if (std::find(baseClasses.begin(), baseClasses.end(), scope) != baseClasses.end())
540+
return;
541+
baseClasses.push_back(scope);
540542
for (const Variable& var: scope->varlist)
541-
usageList.push_back(Usage(&var));
543+
varList.push_back(&var);
542544
if (scope->definedType) {
543545
for (const Type::BaseInfo& baseInfo: scope->definedType->derivedFrom) {
544546
const Scope *baseClass = baseInfo.type ? baseInfo.type->classScope : nullptr;
545547
if (baseClass && baseClass->isClassOrStruct() && baseClass->numConstructors == 0)
546-
createUsageList(usageList, baseClass);
548+
getAllVariableMembers(baseClass, varList, baseClasses);
547549
}
548550
}
549551
}
550552

553+
std::vector<CheckClass::Usage> CheckClass::createUsageList(const Scope *scope)
554+
{
555+
std::vector<Usage> ret;
556+
std::vector<const Variable *> varlist;
557+
std::vector<const Scope *> temp;
558+
getAllVariableMembers(scope, varlist, temp);
559+
for (const Variable *var: varlist)
560+
ret.emplace_back(var);
561+
return ret;
562+
}
563+
551564
void CheckClass::assignVar(std::vector<Usage> &usageList, nonneg int varid)
552565
{
553566
for (Usage& usage: usageList) {

lib/checkclass.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -296,10 +296,9 @@ class CPPCHECKLIB CheckClass : public Check {
296296
/**
297297
* @brief Create usage list that contains all scope members and also members
298298
* of base classes without constructors.
299-
* @param usageList usageList that will be filled up
300299
* @param scope current class scope
301300
*/
302-
static void createUsageList(std::vector<Usage>& usageList, const Scope *scope);
301+
static std::vector<Usage> createUsageList(const Scope *scope);
303302

304303
/**
305304
* @brief assign a variable in the varlist

0 commit comments

Comments
 (0)