void CheckLeakAutoVar::ret(const Token *tok, const VarInfo &varInfo) { const std::map<unsigned int, int> &alloctype = varInfo.alloctype; const std::map<unsigned int, std::string> &possibleUsage = varInfo.possibleUsage; const SymbolDatabase *symbolDatabase = _tokenizer->getSymbolDatabase(); for (std::map<unsigned int, int>::const_iterator it = alloctype.begin(); it != alloctype.end(); ++it) { // don't warn if variable is conditionally allocated if (it->second != DEALLOC && varInfo.conditionalAlloc.find(it->first) != varInfo.conditionalAlloc.end()) continue; // don't warn if there is a reference of the variable if (varInfo.referenced.find(it->first) != varInfo.referenced.end()) continue; const unsigned int varid = it->first; const Variable *var = symbolDatabase->getVariableFromVarId(varid); if (var) { bool used = false; for (const Token *tok2 = tok; tok2; tok2 = tok2->next()) { if (tok2->str() == ";") break; if (Token::Match(tok2, "return|(|, %varid% [);,]", varid)) { used = true; break; } if (Token::Match(tok2, "return|(|, & %varid% . %var% [);,]", varid)) { used = true; break; } } // return deallocated pointer if (used && it->second == DEALLOC) deallocReturnError(tok, var->name()); else if (!used && it->second != DEALLOC) { const std::map<unsigned int, std::string>::const_iterator use = possibleUsage.find(varid); if (use == possibleUsage.end()) { leakError(tok, var->name(), it->second); } else { configurationInfo(tok, use->second); } } } } }
void CheckLeakAutoVar::leakIfAllocated(const Token *vartok, const VarInfo &varInfo) { const std::map<unsigned int, std::string> &alloctype = varInfo.alloctype; const std::map<unsigned int, std::string> &possibleUsage = varInfo.possibleUsage; const std::map<unsigned int,std::string>::const_iterator var = alloctype.find(vartok->varId()); if (var != alloctype.end() && var->second != "dealloc") { const std::map<unsigned int, std::string>::const_iterator use = possibleUsage.find(vartok->varId()); if (use == possibleUsage.end()) { leakError(vartok, vartok->str()); } else { configurationInfo(vartok, use->second); } } }