| 3650 | } |
| 3651 | |
| 3652 | void CheckClassImpl::checkUnsafeClassRefMember() |
| 3653 | { |
| 3654 | if (!mSettings.safeChecks.classes || !mSettings.severity.isEnabled(Severity::warning)) |
| 3655 | return; |
| 3656 | logChecker("CheckClass::checkUnsafeClassRefMember"); // warning,safeChecks |
| 3657 | for (const Scope * classScope : mSymbolDatabase->classAndStructScopes) { |
| 3658 | for (const Function &func : classScope->functionList) { |
| 3659 | if (!func.hasBody() || !func.isConstructor()) |
| 3660 | continue; |
| 3661 | |
| 3662 | const Token *initList = func.constructorMemberInitialization(); |
| 3663 | while (Token::Match(initList, "[:,] %name% (")) { |
| 3664 | if (Token::Match(initList->tokAt(2), "( %var% )")) { |
| 3665 | const Variable * const memberVar = initList->next()->variable(); |
| 3666 | const Variable * const argVar = initList->tokAt(3)->variable(); |
| 3667 | if (memberVar && argVar && memberVar->isConst() && memberVar->isReference() && argVar->isArgument() && argVar->isConst() && argVar->isReference()) |
| 3668 | unsafeClassRefMemberError(initList->next(), classScope->className + "::" + memberVar->name()); |
| 3669 | } |
| 3670 | initList = initList->linkAt(2)->next(); |
| 3671 | } |
| 3672 | } |
| 3673 | } |
| 3674 | } |
| 3675 | |
| 3676 | void CheckClassImpl::unsafeClassRefMemberError(const Token *tok, const std::string &varname) |
| 3677 | { |