Skip to content

Commit 989d276

Browse files
authored
removed the need for Check object in CTU::getUnsafeUsage() callback / some CheckUninitVar cleanups (#5610)
The `Check` objects were just created for that purpose so they basically just were wrappers for the pointers passed into them and were unnecessary.
1 parent f62caa6 commit 989d276

8 files changed

Lines changed: 29 additions & 42 deletions

File tree

lib/checkbufferoverrun.cpp

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -906,14 +906,11 @@ namespace {
906906
};
907907
}
908908

909-
bool CheckBufferOverrun::isCtuUnsafeBufferUsage(const Check *check, const Token *argtok, MathLib::bigint *offset, int type)
909+
bool CheckBufferOverrun::isCtuUnsafeBufferUsage(const Settings *settings, const Token *argtok, MathLib::bigint *offset, int type)
910910
{
911911
if (!offset)
912912
return false;
913-
const CheckBufferOverrun *c = dynamic_cast<const CheckBufferOverrun *>(check);
914-
if (!c)
915-
return false;
916-
if (!argtok->valueType() || argtok->valueType()->typeSize(c->mSettings->platform) == 0)
913+
if (!argtok->valueType() || argtok->valueType()->typeSize(settings->platform) == 0)
917914
return false;
918915
const Token *indexTok = nullptr;
919916
if (type == 1 && Token::Match(argtok, "%name% [") && argtok->astParent() == argtok->next() && !Token::simpleMatch(argtok->linkAt(1), "] ["))
@@ -926,27 +923,26 @@ bool CheckBufferOverrun::isCtuUnsafeBufferUsage(const Check *check, const Token
926923
return false;
927924
if (!indexTok->hasKnownIntValue())
928925
return false;
929-
*offset = indexTok->getKnownIntValue() * argtok->valueType()->typeSize(c->mSettings->platform);
926+
*offset = indexTok->getKnownIntValue() * argtok->valueType()->typeSize(settings->platform);
930927
return true;
931928
}
932929

933-
bool CheckBufferOverrun::isCtuUnsafeArrayIndex(const Check *check, const Token *argtok, MathLib::bigint *offset)
930+
bool CheckBufferOverrun::isCtuUnsafeArrayIndex(const Settings *settings, const Token *argtok, MathLib::bigint *offset)
934931
{
935-
return CheckBufferOverrun::isCtuUnsafeBufferUsage(check, argtok, offset, 1);
932+
return isCtuUnsafeBufferUsage(settings, argtok, offset, 1);
936933
}
937934

938-
bool CheckBufferOverrun::isCtuUnsafePointerArith(const Check *check, const Token *argtok, MathLib::bigint *offset)
935+
bool CheckBufferOverrun::isCtuUnsafePointerArith(const Settings *settings, const Token *argtok, MathLib::bigint *offset)
939936
{
940-
return CheckBufferOverrun::isCtuUnsafeBufferUsage(check, argtok, offset, 2);
937+
return isCtuUnsafeBufferUsage(settings, argtok, offset, 2);
941938
}
942939

943940
/** @brief Parse current TU and extract file info */
944941
Check::FileInfo *CheckBufferOverrun::getFileInfo(const Tokenizer *tokenizer, const Settings *settings) const
945942
{
946-
CheckBufferOverrun checkBufferOverrun(tokenizer, settings, nullptr);
947943
MyFileInfo *fileInfo = new MyFileInfo;
948-
fileInfo->unsafeArrayIndex = CTU::getUnsafeUsage(tokenizer, settings, &checkBufferOverrun, isCtuUnsafeArrayIndex);
949-
fileInfo->unsafePointerArith = CTU::getUnsafeUsage(tokenizer, settings, &checkBufferOverrun, isCtuUnsafePointerArith);
944+
fileInfo->unsafeArrayIndex = CTU::getUnsafeUsage(tokenizer, settings, isCtuUnsafeArrayIndex);
945+
fileInfo->unsafePointerArith = CTU::getUnsafeUsage(tokenizer, settings, isCtuUnsafePointerArith);
950946
if (fileInfo->unsafeArrayIndex.empty() && fileInfo->unsafePointerArith.empty()) {
951947
delete fileInfo;
952948
return nullptr;

lib/checkbufferoverrun.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -130,9 +130,9 @@ class CPPCHECKLIB CheckBufferOverrun : public Check {
130130
ValueFlow::Value getBufferSize(const Token *bufTok) const;
131131

132132
// CTU
133-
static bool isCtuUnsafeBufferUsage(const Check *check, const Token *argtok, MathLib::bigint *offset, int type);
134-
static bool isCtuUnsafeArrayIndex(const Check *check, const Token *argtok, MathLib::bigint *offset);
135-
static bool isCtuUnsafePointerArith(const Check *check, const Token *argtok, MathLib::bigint *offset);
133+
static bool isCtuUnsafeBufferUsage(const Settings *settings, const Token *argtok, MathLib::bigint *offset, int type);
134+
static bool isCtuUnsafeArrayIndex(const Settings *settings, const Token *argtok, MathLib::bigint *offset);
135+
static bool isCtuUnsafePointerArith(const Settings *settings, const Token *argtok, MathLib::bigint *offset);
136136

137137
Check::FileInfo * loadFileInfoFromXml(const tinyxml2::XMLElement *xmlElement) const override;
138138
static bool analyseWholeProgram1(const std::map<std::string, std::list<const CTU::FileInfo::CallBase *>> &callsMap, const CTU::FileInfo::UnsafeUsage &unsafeUsage, int type, ErrorLogger &errorLogger);

lib/checknullpointer.cpp

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -549,12 +549,11 @@ void CheckNullPointer::redundantConditionWarning(const Token* tok, const ValueFl
549549
}
550550

551551
// NOLINTNEXTLINE(readability-non-const-parameter) - used as callback so we need to preserve the signature
552-
static bool isUnsafeUsage(const Check *check, const Token *vartok, MathLib::bigint *value)
552+
static bool isUnsafeUsage(const Settings *settings, const Token *vartok, MathLib::bigint *value)
553553
{
554554
(void)value;
555-
const CheckNullPointer *checkNullPointer = dynamic_cast<const CheckNullPointer *>(check);
556555
bool unknown = false;
557-
return checkNullPointer && checkNullPointer->isPointerDeRef(vartok, unknown);
556+
return CheckNullPointer::isPointerDeRef(vartok, unknown, settings);
558557
}
559558

560559
namespace {
@@ -575,8 +574,7 @@ namespace {
575574

576575
Check::FileInfo *CheckNullPointer::getFileInfo(const Tokenizer *tokenizer, const Settings *settings) const
577576
{
578-
CheckNullPointer check(tokenizer, settings, nullptr);
579-
const std::list<CTU::FileInfo::UnsafeUsage> &unsafeUsage = CTU::getUnsafeUsage(tokenizer, settings, &check, ::isUnsafeUsage);
577+
const std::list<CTU::FileInfo::UnsafeUsage> &unsafeUsage = CTU::getUnsafeUsage(tokenizer, settings, isUnsafeUsage);
580578
if (unsafeUsage.empty())
581579
return nullptr;
582580

lib/checkuninitvar.cpp

Lines changed: 7 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1129,8 +1129,9 @@ static bool isVoidCast(const Token *tok)
11291129
return Token::simpleMatch(tok, "(") && tok->isCast() && tok->valueType() && tok->valueType()->type == ValueType::Type::VOID && tok->valueType()->pointer == 0;
11301130
}
11311131

1132-
const Token* CheckUninitVar::isVariableUsage(bool cpp, const Token *vartok, const Library& library, bool pointer, Alloc alloc, int indirect)
1132+
const Token* CheckUninitVar::isVariableUsage(const Token *vartok, const Library& library, bool pointer, Alloc alloc, int indirect)
11331133
{
1134+
const bool cpp = vartok->isCpp();
11341135
const Token *valueExpr = vartok; // non-dereferenced , no address of value as variable
11351136
while (Token::Match(valueExpr->astParent(), ".|::") && astIsRhs(valueExpr))
11361137
valueExpr = valueExpr->astParent();
@@ -1334,7 +1335,7 @@ const Token* CheckUninitVar::isVariableUsage(bool cpp, const Token *vartok, cons
13341335

13351336
const Token* CheckUninitVar::isVariableUsage(const Token *vartok, bool pointer, Alloc alloc, int indirect) const
13361337
{
1337-
return CheckUninitVar::isVariableUsage(mTokenizer->isCPP(), vartok, mSettings->library, pointer, alloc, indirect);
1338+
return isVariableUsage(vartok, mSettings->library, pointer, alloc, indirect);
13381339
}
13391340

13401341
/***
@@ -1681,18 +1682,11 @@ void CheckUninitVar::valueFlowUninit()
16811682
}
16821683
}
16831684

1684-
Check::FileInfo *CheckUninitVar::getFileInfo(const Tokenizer *tokenizer, const Settings *settings) const
1685-
{
1686-
const CheckUninitVar checker(tokenizer, settings, nullptr);
1687-
return checker.getFileInfo();
1688-
}
1689-
16901685
// NOLINTNEXTLINE(readability-non-const-parameter) - used as callback so we need to preserve the signature
1691-
static bool isVariableUsage(const Check *check, const Token *vartok, MathLib::bigint *value)
1686+
static bool isVariableUsage(const Settings *settings, const Token *vartok, MathLib::bigint *value)
16921687
{
16931688
(void)value;
1694-
const CheckUninitVar *c = dynamic_cast<const CheckUninitVar *>(check);
1695-
return c && c->isVariableUsage(vartok, true, CheckUninitVar::Alloc::ARRAY);
1689+
return CheckUninitVar::isVariableUsage(vartok, settings->library, true, CheckUninitVar::Alloc::ARRAY);
16961690
}
16971691

16981692
namespace {
@@ -1710,9 +1704,9 @@ namespace {
17101704
};
17111705
}
17121706

1713-
Check::FileInfo *CheckUninitVar::getFileInfo() const
1707+
Check::FileInfo *CheckUninitVar::getFileInfo(const Tokenizer *tokenizer, const Settings *settings) const
17141708
{
1715-
const std::list<CTU::FileInfo::UnsafeUsage> &unsafeUsage = CTU::getUnsafeUsage(mTokenizer, mSettings, this, ::isVariableUsage);
1709+
const std::list<CTU::FileInfo::UnsafeUsage> &unsafeUsage = CTU::getUnsafeUsage(tokenizer, settings, ::isVariableUsage);
17161710
if (unsafeUsage.empty())
17171711
return nullptr;
17181712

lib/checkuninitvar.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ class CPPCHECKLIB CheckUninitVar : public Check {
7171

7272
enum Alloc { NO_ALLOC, NO_CTOR_CALL, CTOR_CALL, ARRAY };
7373

74-
static const Token *isVariableUsage(bool cpp, const Token *vartok, const Library &library, bool pointer, Alloc alloc, int indirect = 0);
74+
static const Token *isVariableUsage(const Token *vartok, const Library &library, bool pointer, Alloc alloc, int indirect = 0);
7575
const Token *isVariableUsage(const Token *vartok, bool pointer, Alloc alloc, int indirect = 0) const;
7676

7777
private:
@@ -129,7 +129,6 @@ class CPPCHECKLIB CheckUninitVar : public Check {
129129
void uninitStructMemberError(const Token *tok, const std::string &membername);
130130

131131
std::set<const Token*> mUninitDiags;
132-
Check::FileInfo* getFileInfo() const;
133132

134133
void getErrorMessages(ErrorLogger* errorLogger, const Settings* settings) const override
135134
{

lib/ctu.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -436,7 +436,7 @@ CTU::FileInfo *CTU::getFileInfo(const Tokenizer *tokenizer)
436436
return fileInfo;
437437
}
438438

439-
static std::list<std::pair<const Token *, MathLib::bigint>> getUnsafeFunction(const Tokenizer *tokenizer, const Settings *settings, const Scope *scope, int argnr, const Check *check, bool (*isUnsafeUsage)(const Check *check, const Token *argtok, MathLib::bigint *value))
439+
static std::list<std::pair<const Token *, MathLib::bigint>> getUnsafeFunction(const Tokenizer *tokenizer, const Settings *settings, const Scope *scope, int argnr, bool (*isUnsafeUsage)(const Settings *settings, const Token *argtok, MathLib::bigint *value))
440440
{
441441
std::list<std::pair<const Token *, MathLib::bigint>> ret;
442442
const Variable * const argvar = scope->function->getArgumentVar(argnr);
@@ -460,15 +460,15 @@ static std::list<std::pair<const Token *, MathLib::bigint>> getUnsafeFunction(co
460460
if (tok2->variable() != argvar)
461461
continue;
462462
MathLib::bigint value = 0;
463-
if (!isUnsafeUsage(check, tok2, &value))
463+
if (!isUnsafeUsage(settings, tok2, &value))
464464
return ret; // TODO: Is this a read? then continue..
465465
ret.emplace_back(tok2, value);
466466
return ret;
467467
}
468468
return ret;
469469
}
470470

471-
std::list<CTU::FileInfo::UnsafeUsage> CTU::getUnsafeUsage(const Tokenizer *tokenizer, const Settings *settings, const Check *check, bool (*isUnsafeUsage)(const Check *check, const Token *argtok, MathLib::bigint *value))
471+
std::list<CTU::FileInfo::UnsafeUsage> CTU::getUnsafeUsage(const Tokenizer *tokenizer, const Settings *settings, bool (*isUnsafeUsage)(const Settings *settings, const Token *argtok, MathLib::bigint *value))
472472
{
473473
std::list<CTU::FileInfo::UnsafeUsage> unsafeUsage;
474474

@@ -482,7 +482,7 @@ std::list<CTU::FileInfo::UnsafeUsage> CTU::getUnsafeUsage(const Tokenizer *token
482482

483483
// "Unsafe" functions unconditionally reads data before it is written..
484484
for (int argnr = 0; argnr < function->argCount(); ++argnr) {
485-
for (const std::pair<const Token *, MathLib::bigint> &v : getUnsafeFunction(tokenizer, settings, &scope, argnr, check, isUnsafeUsage)) {
485+
for (const std::pair<const Token *, MathLib::bigint> &v : getUnsafeFunction(tokenizer, settings, &scope, argnr, isUnsafeUsage)) {
486486
const Token *tok = v.first;
487487
const MathLib::bigint val = v.second;
488488
unsafeUsage.emplace_back(CTU::getFunctionId(tokenizer, function), argnr+1, tok->str(), CTU::FileInfo::Location(tokenizer,tok), val);

lib/ctu.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ namespace CTU {
146146
/** @brief Parse current TU and extract file info */
147147
CPPCHECKLIB FileInfo *getFileInfo(const Tokenizer *tokenizer);
148148

149-
CPPCHECKLIB std::list<FileInfo::UnsafeUsage> getUnsafeUsage(const Tokenizer *tokenizer, const Settings *settings, const Check *check, bool (*isUnsafeUsage)(const Check *check, const Token *argtok, MathLib::bigint *value));
149+
CPPCHECKLIB std::list<FileInfo::UnsafeUsage> getUnsafeUsage(const Tokenizer *tokenizer, const Settings *settings, bool (*isUnsafeUsage)(const Settings *settings, const Token *argtok, MathLib::bigint *value));
150150

151151
CPPCHECKLIB std::list<FileInfo::UnsafeUsage> loadUnsafeUsageListFromXml(const tinyxml2::XMLElement *xmlElement);
152152
}

lib/valueflow.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7658,7 +7658,7 @@ static void valueFlowSubFunction(TokenList& tokenlist, SymbolDatabase& symboldat
76587658
});
76597659
// Remove uninit values if argument is passed by value
76607660
if (argtok->variable() && !argtok->variable()->isPointer() && argvalues.size() == 1 && argvalues.front().isUninitValue()) {
7661-
if (CheckUninitVar::isVariableUsage(tokenlist.isCPP(), argtok, settings.library, false, CheckUninitVar::Alloc::NO_ALLOC, 0))
7661+
if (CheckUninitVar::isVariableUsage(argtok, settings.library, false, CheckUninitVar::Alloc::NO_ALLOC, 0))
76627662
continue;
76637663
}
76647664

0 commit comments

Comments
 (0)