Merge pull request #374 from Dmitry-Me/useTempVariablesToAvoidRepeatedActions
Use temp variables to avoid repeated actions in code.
This commit is contained in:
commit
1cb37e9870
|
@ -75,8 +75,8 @@ CheckClass::CheckClass(const Tokenizer *tokenizer, const Settings *settings, Err
|
||||||
|
|
||||||
void CheckClass::constructors()
|
void CheckClass::constructors()
|
||||||
{
|
{
|
||||||
bool style = _settings->isEnabled("style");
|
const bool style = _settings->isEnabled("style");
|
||||||
bool warnings = _settings->isEnabled("warning");
|
const bool warnings = _settings->isEnabled("warning");
|
||||||
if (!style && !warnings)
|
if (!style && !warnings)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
@ -419,9 +419,10 @@ bool CheckClass::isBaseClassFunc(const Token *tok, const Scope *scope)
|
||||||
|
|
||||||
// Check if base class exists in database
|
// Check if base class exists in database
|
||||||
if (derivedFrom && derivedFrom->classScope) {
|
if (derivedFrom && derivedFrom->classScope) {
|
||||||
|
const std::list<Function>& functionList = derivedFrom->classScope->functionList;
|
||||||
std::list<Function>::const_iterator func;
|
std::list<Function>::const_iterator func;
|
||||||
|
|
||||||
for (func = derivedFrom->classScope->functionList.begin(); func != derivedFrom->classScope->functionList.end(); ++func) {
|
for (func = functionList.begin(); func != functionList.end(); ++func) {
|
||||||
if (func->tokenDef->str() == tok->str())
|
if (func->tokenDef->str() == tok->str())
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -880,30 +881,31 @@ void CheckClass::privateFunctions()
|
||||||
if (Token::findsimplematch(scope->classStart, "; __property ;", scope->classEnd))
|
if (Token::findsimplematch(scope->classStart, "; __property ;", scope->classEnd))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
std::list<const Function*> FuncList;
|
std::list<const Function*> privateFunctions;
|
||||||
for (std::list<Function>::const_iterator func = scope->functionList.begin(); func != scope->functionList.end(); ++func) {
|
for (std::list<Function>::const_iterator func = scope->functionList.begin(); func != scope->functionList.end(); ++func) {
|
||||||
// Get private functions..
|
// Get private functions..
|
||||||
if (func->type == Function::eFunction && func->access == Private && !func->isOperator) // TODO: There are smarter ways to check private operator usage
|
if (func->type == Function::eFunction && func->access == Private && !func->isOperator) // TODO: There are smarter ways to check private operator usage
|
||||||
FuncList.push_back(&*func);
|
privateFunctions.push_back(&*func);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Bailout for overridden virtual functions of base classes
|
// Bailout for overridden virtual functions of base classes
|
||||||
if (!scope->definedType->derivedFrom.empty()) {
|
if (!scope->definedType->derivedFrom.empty()) {
|
||||||
// Check virtual functions
|
// Check virtual functions
|
||||||
for (std::list<const Function*>::iterator it = FuncList.begin(); it != FuncList.end();) {
|
for (std::list<const Function*>::iterator it = privateFunctions.begin(); it != privateFunctions.end();) {
|
||||||
if ((*it)->isImplicitlyVirtual(true)) // Give true as default value to be returned if we don't see all base classes
|
if ((*it)->isImplicitlyVirtual(true)) // Give true as default value to be returned if we don't see all base classes
|
||||||
FuncList.erase(it++);
|
privateFunctions.erase(it++);
|
||||||
else
|
else
|
||||||
++it;
|
++it;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
while (!FuncList.empty()) {
|
while (!privateFunctions.empty()) {
|
||||||
const std::string& funcName = FuncList.front()->tokenDef->str();
|
const std::string& funcName = privateFunctions.front()->tokenDef->str();
|
||||||
// Check that all private functions are used
|
// Check that all private functions are used
|
||||||
bool used = checkFunctionUsage(funcName, &*scope); // Usage in this class
|
bool used = checkFunctionUsage(funcName, &*scope); // Usage in this class
|
||||||
// Check in friend classes
|
// Check in friend classes
|
||||||
for (std::list<Type::FriendInfo>::const_iterator it = scope->definedType->friendList.begin(); !used && it != scope->definedType->friendList.end(); ++it) {
|
const std::list<Type::FriendInfo>& friendList = scope->definedType->friendList;
|
||||||
|
for (std::list<Type::FriendInfo>::const_iterator it = friendList.begin(); !used && it != friendList.end(); ++it) {
|
||||||
if (it->type)
|
if (it->type)
|
||||||
used = checkFunctionUsage(funcName, it->type->classScope);
|
used = checkFunctionUsage(funcName, it->type->classScope);
|
||||||
else
|
else
|
||||||
|
@ -911,9 +913,9 @@ void CheckClass::privateFunctions()
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!used)
|
if (!used)
|
||||||
unusedPrivateFunctionError(FuncList.front()->tokenDef, scope->className, funcName);
|
unusedPrivateFunctionError(privateFunctions.front()->tokenDef, scope->className, funcName);
|
||||||
|
|
||||||
FuncList.pop_front();
|
privateFunctions.pop_front();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -945,8 +947,7 @@ void CheckClass::checkMemset()
|
||||||
for (const Token *tok = scope->classStart; tok && tok != scope->classEnd; tok = tok->next()) {
|
for (const Token *tok = scope->classStart; tok && tok != scope->classEnd; tok = tok->next()) {
|
||||||
if (Token::Match(tok, "memset|memcpy|memmove ( %any%")) {
|
if (Token::Match(tok, "memset|memcpy|memmove ( %any%")) {
|
||||||
const Token* arg1 = tok->tokAt(2);
|
const Token* arg1 = tok->tokAt(2);
|
||||||
const Token* arg3 = arg1;
|
const Token* arg3 = arg1->nextArgument();
|
||||||
arg3 = arg3->nextArgument();
|
|
||||||
if (arg3)
|
if (arg3)
|
||||||
arg3 = arg3->nextArgument();
|
arg3 = arg3->nextArgument();
|
||||||
if (!arg3)
|
if (!arg3)
|
||||||
|
@ -1043,8 +1044,9 @@ void CheckClass::checkMemsetType(const Scope *start, const Token *tok, const Sco
|
||||||
|
|
||||||
// recursively check all parent classes
|
// recursively check all parent classes
|
||||||
for (std::size_t i = 0; i < type->definedType->derivedFrom.size(); i++) {
|
for (std::size_t i = 0; i < type->definedType->derivedFrom.size(); i++) {
|
||||||
if (type->definedType->derivedFrom[i].type && type->definedType->derivedFrom[i].type->classScope)
|
const Type* derivedFrom = type->definedType->derivedFrom[i].type;
|
||||||
checkMemsetType(start, tok, type->definedType->derivedFrom[i].type->classScope, allocation, parsedTypes);
|
if (derivedFrom && derivedFrom->classScope)
|
||||||
|
checkMemsetType(start, tok, derivedFrom->classScope, allocation, parsedTypes);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Warn if type is a class that contains any virtual functions
|
// Warn if type is a class that contains any virtual functions
|
||||||
|
|
|
@ -1015,8 +1015,9 @@ SymbolDatabase::SymbolDatabase(const Tokenizer *tokenizer, const Settings *setti
|
||||||
// check each array variable
|
// check each array variable
|
||||||
if (_variableList[i] && _variableList[i]->isArray()) {
|
if (_variableList[i] && _variableList[i]->isArray()) {
|
||||||
// check each array dimension
|
// check each array dimension
|
||||||
for (std::size_t j = 0; j < _variableList[i]->dimensions().size(); j++) {
|
const std::vector<Dimension>& dimensions = _variableList[i]->dimensions();
|
||||||
Dimension &dimension = const_cast<Dimension &>(_variableList[i]->dimensions()[j]);
|
for (std::size_t j = 0; j < dimensions.size(); j++) {
|
||||||
|
Dimension &dimension = const_cast<Dimension &>(dimensions[j]);
|
||||||
// check for a single token dimension that is a variable
|
// check for a single token dimension that is a variable
|
||||||
if (dimension.num == 0) {
|
if (dimension.num == 0) {
|
||||||
dimension.known = false;
|
dimension.known = false;
|
||||||
|
@ -1361,12 +1362,14 @@ Function* SymbolDatabase::addGlobalFunction(Scope*& scope, const Token*& tok, co
|
||||||
if (i->tokenDef->str() == tok->str() && Function::argsMatch(scope, i->argDef->next(), argStart->next(), "", 0)) {
|
if (i->tokenDef->str() == tok->str() && Function::argsMatch(scope, i->argDef->next(), argStart->next(), "", 0)) {
|
||||||
function = &*i;
|
function = &*i;
|
||||||
// copy attributes from function prototype to function
|
// copy attributes from function prototype to function
|
||||||
const_cast<Token *>(tok)->isAttributeConstructor(i->tokenDef->isAttributeConstructor());
|
Token* to = const_cast<Token *>(tok);
|
||||||
const_cast<Token *>(tok)->isAttributeDestructor(i->tokenDef->isAttributeDestructor());
|
const Token* from = i->tokenDef;
|
||||||
const_cast<Token *>(tok)->isAttributePure(i->tokenDef->isAttributePure());
|
to->isAttributeConstructor(from->isAttributeConstructor());
|
||||||
const_cast<Token *>(tok)->isAttributeConst(i->tokenDef->isAttributeConst());
|
to->isAttributeDestructor(from->isAttributeDestructor());
|
||||||
const_cast<Token *>(tok)->isAttributeNothrow(i->tokenDef->isAttributeNothrow());
|
to->isAttributePure(from->isAttributePure());
|
||||||
const_cast<Token *>(tok)->isDeclspecNothrow(i->tokenDef->isDeclspecNothrow());
|
to->isAttributeConst(from->isAttributeConst());
|
||||||
|
to->isAttributeNothrow(from->isAttributeNothrow());
|
||||||
|
to->isDeclspecNothrow(from->isDeclspecNothrow());
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2293,9 +2296,10 @@ bool Function::isImplicitlyVirtual_rec(const ::Type* baseType, bool& safe) const
|
||||||
{
|
{
|
||||||
// check each base class
|
// check each base class
|
||||||
for (std::size_t i = 0; i < baseType->derivedFrom.size(); ++i) {
|
for (std::size_t i = 0; i < baseType->derivedFrom.size(); ++i) {
|
||||||
|
const ::Type* derivedFromType = baseType->derivedFrom[i].type;
|
||||||
// check if base class exists in database
|
// check if base class exists in database
|
||||||
if (baseType->derivedFrom[i].type && baseType->derivedFrom[i].type->classScope) {
|
if (derivedFromType && derivedFromType->classScope) {
|
||||||
const Scope *parent = baseType->derivedFrom[i].type->classScope;
|
const Scope *parent = derivedFromType->classScope;
|
||||||
|
|
||||||
std::list<Function>::const_iterator func;
|
std::list<Function>::const_iterator func;
|
||||||
|
|
||||||
|
@ -2324,10 +2328,10 @@ bool Function::isImplicitlyVirtual_rec(const ::Type* baseType, bool& safe) const
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!baseType->derivedFrom[i].type->derivedFrom.empty() && !baseType->derivedFrom[i].type->hasCircularDependencies()) {
|
if (!derivedFromType->derivedFrom.empty() && !derivedFromType->hasCircularDependencies()) {
|
||||||
// avoid endless recursion, see #5289 Crash: Stack overflow in isImplicitlyVirtual_rec when checking SVN and
|
// avoid endless recursion, see #5289 Crash: Stack overflow in isImplicitlyVirtual_rec when checking SVN and
|
||||||
// #5590 with a loop within the class hierarchie.
|
// #5590 with a loop within the class hierarchie.
|
||||||
if (isImplicitlyVirtual_rec(baseType->derivedFrom[i].type, safe)) {
|
if (isImplicitlyVirtual_rec(derivedFromType, safe)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue