Use getAllocFuncInfo() (#5176)
This commit is contained in:
parent
b259617f65
commit
b26bfc9b4f
|
@ -499,7 +499,8 @@ void CheckClass::copyconstructors()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (tok = func.functionScope->bodyStart; tok != func.functionScope->bodyEnd; tok = tok->next()) {
|
for (tok = func.functionScope->bodyStart; tok != func.functionScope->bodyEnd; tok = tok->next()) {
|
||||||
if (Token::Match(tok, "%var% = new|malloc|g_malloc|g_try_malloc|realloc|g_realloc|g_try_realloc")) {
|
if ((mTokenizer->isCPP() && Token::Match(tok, "%var% = new")) ||
|
||||||
|
(Token::Match(tok, "%var% = %name% (") && (mSettings->library.getAllocFuncInfo(tok->tokAt(2)) || mSettings->library.getReallocFuncInfo(tok->tokAt(2))))) {
|
||||||
allocatedVars.erase(tok->varId());
|
allocatedVars.erase(tok->varId());
|
||||||
} else if (Token::Match(tok, "%var% = %name% . %name% ;") && allocatedVars.find(tok->varId()) != allocatedVars.end()) {
|
} else if (Token::Match(tok, "%var% = %name% . %name% ;") && allocatedVars.find(tok->varId()) != allocatedVars.end()) {
|
||||||
copiedVars.insert(tok);
|
copiedVars.insert(tok);
|
||||||
|
@ -1404,7 +1405,8 @@ void CheckClass::checkMemset()
|
||||||
const std::set<const Scope *> parsedTypes;
|
const std::set<const Scope *> parsedTypes;
|
||||||
checkMemsetType(scope, tok, type, false, parsedTypes);
|
checkMemsetType(scope, tok, type, false, parsedTypes);
|
||||||
}
|
}
|
||||||
} else if (tok->variable() && tok->variable()->typeScope() && Token::Match(tok, "%var% = calloc|malloc|realloc|g_malloc|g_try_malloc|g_realloc|g_try_realloc (")) {
|
} else if (tok->variable() && tok->variable()->typeScope() && Token::Match(tok, "%var% = %name% (") &&
|
||||||
|
(mSettings->library.getAllocFuncInfo(tok->tokAt(2)) || mSettings->library.getReallocFuncInfo(tok->tokAt(2)))) {
|
||||||
const std::set<const Scope *> parsedTypes;
|
const std::set<const Scope *> parsedTypes;
|
||||||
checkMemsetType(scope, tok->tokAt(2), tok->variable()->typeScope(), true, parsedTypes);
|
checkMemsetType(scope, tok->tokAt(2), tok->variable()->typeScope(), true, parsedTypes);
|
||||||
|
|
||||||
|
@ -1737,16 +1739,18 @@ bool CheckClass::hasAllocation(const Function *func, const Scope* scope, const T
|
||||||
if (!end)
|
if (!end)
|
||||||
end = func->functionScope->bodyEnd;
|
end = func->functionScope->bodyEnd;
|
||||||
for (const Token *tok = start; tok && (tok != end); tok = tok->next()) {
|
for (const Token *tok = start; tok && (tok != end); tok = tok->next()) {
|
||||||
if (Token::Match(tok, "%var% = malloc|realloc|calloc|new") && isMemberVar(scope, tok))
|
if (((mTokenizer->isCPP() && Token::Match(tok, "%var% = new")) ||
|
||||||
|
(Token::Match(tok, "%var% = %name% (") && mSettings->library.getAllocFuncInfo(tok->tokAt(2)))) &&
|
||||||
|
isMemberVar(scope, tok))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
// check for deallocating memory
|
// check for deallocating memory
|
||||||
const Token *var;
|
const Token *var;
|
||||||
if (Token::Match(tok, "%name% ( %var%") && mSettings->library.getDeallocFuncInfo(tok))
|
if (Token::Match(tok, "%name% ( %var%") && mSettings->library.getDeallocFuncInfo(tok))
|
||||||
var = tok->tokAt(2);
|
var = tok->tokAt(2);
|
||||||
else if (Token::Match(tok, "delete [ ] %var%"))
|
else if (mTokenizer->isCPP() && Token::Match(tok, "delete [ ] %var%"))
|
||||||
var = tok->tokAt(3);
|
var = tok->tokAt(3);
|
||||||
else if (Token::Match(tok, "delete %var%"))
|
else if (mTokenizer->isCPP() && Token::Match(tok, "delete %var%"))
|
||||||
var = tok->next();
|
var = tok->next();
|
||||||
else
|
else
|
||||||
continue;
|
continue;
|
||||||
|
|
|
@ -693,7 +693,7 @@ void CheckMemoryLeakStructMember::check() const
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CheckMemoryLeakStructMember::isMalloc(const Variable *variable)
|
bool CheckMemoryLeakStructMember::isMalloc(const Variable *variable) const
|
||||||
{
|
{
|
||||||
if (!variable)
|
if (!variable)
|
||||||
return false;
|
return false;
|
||||||
|
@ -702,7 +702,7 @@ bool CheckMemoryLeakStructMember::isMalloc(const Variable *variable)
|
||||||
for (const Token *tok2 = variable->nameToken(); tok2 && tok2 != variable->scope()->bodyEnd; tok2 = tok2->next()) {
|
for (const Token *tok2 = variable->nameToken(); tok2 && tok2 != variable->scope()->bodyEnd; tok2 = tok2->next()) {
|
||||||
if (Token::Match(tok2, "= %varid% [;=]", declarationId))
|
if (Token::Match(tok2, "= %varid% [;=]", declarationId))
|
||||||
return false;
|
return false;
|
||||||
if (Token::Match(tok2, "%varid% = malloc|kmalloc (", declarationId)) // TODO use library
|
if (Token::Match(tok2, "%varid% = %name% (", declarationId) && mSettings->library.getAllocFuncInfo(tok2->tokAt(2)))
|
||||||
alloc = true;
|
alloc = true;
|
||||||
}
|
}
|
||||||
return alloc;
|
return alloc;
|
||||||
|
|
|
@ -279,7 +279,7 @@ public:
|
||||||
private:
|
private:
|
||||||
|
|
||||||
/** Is local variable allocated with malloc? */
|
/** Is local variable allocated with malloc? */
|
||||||
static bool isMalloc(const Variable *variable);
|
bool isMalloc(const Variable *variable) const;
|
||||||
|
|
||||||
void checkStructVariable(const Variable* const variable) const;
|
void checkStructVariable(const Variable* const variable) const;
|
||||||
|
|
||||||
|
|
|
@ -2310,7 +2310,8 @@ void CheckOther::checkInvalidFree()
|
||||||
for (const Token* tok = scope->bodyStart->next(); tok != scope->bodyEnd; tok = tok->next()) {
|
for (const Token* tok = scope->bodyStart->next(); tok != scope->bodyEnd; tok = tok->next()) {
|
||||||
|
|
||||||
// Keep track of which variables were assigned addresses to newly-allocated memory
|
// Keep track of which variables were assigned addresses to newly-allocated memory
|
||||||
if (Token::Match(tok, "%var% = malloc|g_malloc|new")) {
|
if ((mTokenizer->isCPP() && Token::Match(tok, "%var% = new")) ||
|
||||||
|
(Token::Match(tok, "%var% = %name% (") && mSettings->library.getAllocFuncInfo(tok->tokAt(2)))) {
|
||||||
allocation.insert(std::make_pair(tok->varId(), tok->strAt(2)));
|
allocation.insert(std::make_pair(tok->varId(), tok->strAt(2)));
|
||||||
inconclusive.insert(std::make_pair(tok->varId(), false));
|
inconclusive.insert(std::make_pair(tok->varId(), false));
|
||||||
}
|
}
|
||||||
|
|
|
@ -127,12 +127,12 @@ void CheckSizeof::checkSizeofForPointerSize()
|
||||||
// Once leaving those tests, it is mandatory to have:
|
// Once leaving those tests, it is mandatory to have:
|
||||||
// - variable matching the used pointer
|
// - variable matching the used pointer
|
||||||
// - tokVar pointing on the argument where sizeof may be used
|
// - tokVar pointing on the argument where sizeof may be used
|
||||||
if (Token::Match(tok->tokAt(2), "malloc|alloca|calloc (")) {
|
if (Token::Match(tok->tokAt(2), "%name% (") && mSettings->library.getAllocFuncInfo(tok->tokAt(2))) {
|
||||||
if (Token::Match(tok, "%var% ="))
|
if (Token::Match(tok, "%var% ="))
|
||||||
variable = tok;
|
variable = tok;
|
||||||
else if (tok->strAt(1) == ")" && Token::Match(tok->linkAt(1)->tokAt(-2), "%var% ="))
|
else if (tok->strAt(1) == ")" && Token::Match(tok->linkAt(1)->tokAt(-2), "%var% ="))
|
||||||
variable = tok->linkAt(1)->tokAt(-2);
|
variable = tok->linkAt(1)->tokAt(-2);
|
||||||
else if (tok->link() && Token::Match(tok, "> ( malloc|alloca|calloc (") && Token::Match(tok->link()->tokAt(-3), "%var% ="))
|
else if (tok->link() && Token::Match(tok, "> ( %name% (") && mSettings->library.getAllocFuncInfo(tok->tokAt(2)) && Token::Match(tok->link()->tokAt(-3), "%var% ="))
|
||||||
variable = tok->link()->tokAt(-3);
|
variable = tok->link()->tokAt(-3);
|
||||||
tokSize = tok->tokAt(4);
|
tokSize = tok->tokAt(4);
|
||||||
tokFunc = tok->tokAt(2);
|
tokFunc = tok->tokAt(2);
|
||||||
|
|
|
@ -1028,7 +1028,8 @@ void CheckUnusedVar::checkFunctionVariableUsage_iterateScopes(const Scope* const
|
||||||
if (var) {
|
if (var) {
|
||||||
// Consider allocating memory separately because allocating/freeing alone does not constitute using the variable
|
// Consider allocating memory separately because allocating/freeing alone does not constitute using the variable
|
||||||
if (var->mType == Variables::pointer &&
|
if (var->mType == Variables::pointer &&
|
||||||
Token::Match(skipBrackets(tok->next()), "= new|malloc|calloc|kmalloc|kzalloc|kcalloc|strdup|strndup|vmalloc|g_new0|g_try_new|g_new|g_malloc|g_malloc0|g_try_malloc|g_try_malloc0|g_strdup|g_strndup|g_strdup_printf")) {
|
((mTokenizer->isCPP() && Token::simpleMatch(skipBrackets(tok->next()), "= new")) ||
|
||||||
|
(Token::Match(skipBrackets(tok->next()), "= %name% (") && mSettings->library.getAllocFuncInfo(tok->tokAt(2))))) {
|
||||||
variables.allocateMemory(varid, tok);
|
variables.allocateMemory(varid, tok);
|
||||||
} else if (var->mType == Variables::pointer || var->mType == Variables::reference) {
|
} else if (var->mType == Variables::pointer || var->mType == Variables::reference) {
|
||||||
variables.read(varid, tok);
|
variables.read(varid, tok);
|
||||||
|
|
|
@ -2891,7 +2891,7 @@ private:
|
||||||
|
|
||||||
#define checkNoMemset(...) checkNoMemset_(__FILE__, __LINE__, __VA_ARGS__)
|
#define checkNoMemset(...) checkNoMemset_(__FILE__, __LINE__, __VA_ARGS__)
|
||||||
void checkNoMemset_(const char* file, int line, const char code[]) {
|
void checkNoMemset_(const char* file, int line, const char code[]) {
|
||||||
const Settings settings = settingsBuilder().severity(Severity::warning).severity(Severity::portability).build();
|
const Settings settings = settingsBuilder().severity(Severity::warning).severity(Severity::portability).library("std.cfg").build();
|
||||||
checkNoMemset_(file, line, code, settings);
|
checkNoMemset_(file, line, code, settings);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -36,7 +36,7 @@ public:
|
||||||
TestSizeof() : TestFixture("TestSizeof") {}
|
TestSizeof() : TestFixture("TestSizeof") {}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
const Settings settings = settingsBuilder().severity(Severity::warning).severity(Severity::portability).certainty(Certainty::inconclusive).build();
|
const Settings settings = settingsBuilder().severity(Severity::warning).severity(Severity::portability).certainty(Certainty::inconclusive).library("std.cfg").build();
|
||||||
|
|
||||||
void run() override {
|
void run() override {
|
||||||
TEST_CASE(sizeofsizeof);
|
TEST_CASE(sizeofsizeof);
|
||||||
|
|
Loading…
Reference in New Issue