Skip to content

Commit dfed930

Browse files
committed
avoid more unchecked pointer dereferences
1 parent 01c049d commit dfed930

25 files changed

+103
-107
lines changed

lib/astutils.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3286,7 +3286,7 @@ bool isConstVarExpression(const Token *tok, const std::function<bool(const Token
32863286
return false;
32873287
}
32883288

3289-
static ExprUsage getFunctionUsage(const Token* tok, int indirect, const Settings* settings)
3289+
static ExprUsage getFunctionUsage(const Token* tok, int indirect, const Settings& settings)
32903290
{
32913291
const bool addressOf = tok->astParent() && tok->astParent()->isUnaryOp("&");
32923292

@@ -3326,11 +3326,11 @@ static ExprUsage getFunctionUsage(const Token* tok, int indirect, const Settings
33263326
if (ftok->variable()->isStlType() || (ftok->variable()->valueType() && ftok->variable()->valueType()->container)) // STL types or containers don't initialize external variables
33273327
return ExprUsage::Used;
33283328
} else {
3329-
const bool isnullbad = settings->library.isnullargbad(ftok, argnr + 1);
3329+
const bool isnullbad = settings.library.isnullargbad(ftok, argnr + 1);
33303330
if (indirect == 0 && astIsPointer(tok) && !addressOf && isnullbad)
33313331
return ExprUsage::Used;
33323332
bool hasIndirect = false;
3333-
const bool isuninitbad = settings->library.isuninitargbad(ftok, argnr + 1, indirect, &hasIndirect);
3333+
const bool isuninitbad = settings.library.isuninitargbad(ftok, argnr + 1, indirect, &hasIndirect);
33343334
if (isuninitbad && (!addressOf || isnullbad))
33353335
return ExprUsage::Used;
33363336
}
@@ -3349,7 +3349,7 @@ bool isLeafDot(const Token* tok)
33493349
return isLeafDot(parent);
33503350
}
33513351

3352-
ExprUsage getExprUsage(const Token* tok, int indirect, const Settings* settings)
3352+
ExprUsage getExprUsage(const Token* tok, int indirect, const Settings& settings)
33533353
{
33543354
const Token* parent = tok->astParent();
33553355
if (indirect > 0 && parent) {
@@ -3365,7 +3365,7 @@ ExprUsage getExprUsage(const Token* tok, int indirect, const Settings* settings)
33653365
return ExprUsage::NotUsed;
33663366
if (Token::simpleMatch(parent, ":") && Token::simpleMatch(parent->astParent(), "?"))
33673367
return getExprUsage(parent->astParent(), indirect, settings);
3368-
if (isUsedAsBool(tok, settings))
3368+
if (isUsedAsBool(tok, &settings))
33693369
return ExprUsage::NotUsed;
33703370
}
33713371
if (indirect == 0) {

lib/astutils.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -439,7 +439,7 @@ bool isLeafDot(const Token* tok);
439439

440440
enum class ExprUsage { None, NotUsed, PassedByReference, Used, Inconclusive };
441441

442-
ExprUsage getExprUsage(const Token* tok, int indirect, const Settings* settings);
442+
ExprUsage getExprUsage(const Token* tok, int indirect, const Settings& settings);
443443

444444
const Variable *getLHSVariable(const Token *tok);
445445

lib/check.h

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -109,9 +109,7 @@ class CPPCHECKLIB Check {
109109
}
110110
};
111111

112-
virtual FileInfo * getFileInfo(const Tokenizer *tokenizer, const Settings *settings) const {
113-
(void)tokenizer;
114-
(void)settings;
112+
virtual FileInfo * getFileInfo(const Tokenizer& /*tokenizer*/, const Settings& /*settings*/) const {
115113
return nullptr;
116114
}
117115

lib/checkbufferoverrun.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -915,11 +915,11 @@ namespace
915915
};
916916
}
917917

918-
bool CheckBufferOverrun::isCtuUnsafeBufferUsage(const Settings *settings, const Token *argtok, MathLib::bigint *offset, int type)
918+
bool CheckBufferOverrun::isCtuUnsafeBufferUsage(const Settings &settings, const Token *argtok, MathLib::bigint *offset, int type)
919919
{
920920
if (!offset)
921921
return false;
922-
if (!argtok->valueType() || argtok->valueType()->typeSize(settings->platform) == 0)
922+
if (!argtok->valueType() || argtok->valueType()->typeSize(settings.platform) == 0)
923923
return false;
924924
const Token *indexTok = nullptr;
925925
if (type == 1 && Token::Match(argtok, "%name% [") && argtok->astParent() == argtok->next() && !Token::simpleMatch(argtok->linkAt(1), "] ["))
@@ -932,22 +932,22 @@ bool CheckBufferOverrun::isCtuUnsafeBufferUsage(const Settings *settings, const
932932
return false;
933933
if (!indexTok->hasKnownIntValue())
934934
return false;
935-
*offset = indexTok->getKnownIntValue() * argtok->valueType()->typeSize(settings->platform);
935+
*offset = indexTok->getKnownIntValue() * argtok->valueType()->typeSize(settings.platform);
936936
return true;
937937
}
938938

939-
bool CheckBufferOverrun::isCtuUnsafeArrayIndex(const Settings *settings, const Token *argtok, MathLib::bigint *offset)
939+
bool CheckBufferOverrun::isCtuUnsafeArrayIndex(const Settings &settings, const Token *argtok, MathLib::bigint *offset)
940940
{
941941
return isCtuUnsafeBufferUsage(settings, argtok, offset, 1);
942942
}
943943

944-
bool CheckBufferOverrun::isCtuUnsafePointerArith(const Settings *settings, const Token *argtok, MathLib::bigint *offset)
944+
bool CheckBufferOverrun::isCtuUnsafePointerArith(const Settings &settings, const Token *argtok, MathLib::bigint *offset)
945945
{
946946
return isCtuUnsafeBufferUsage(settings, argtok, offset, 2);
947947
}
948948

949949
/** @brief Parse current TU and extract file info */
950-
Check::FileInfo *CheckBufferOverrun::getFileInfo(const Tokenizer *tokenizer, const Settings *settings) const
950+
Check::FileInfo *CheckBufferOverrun::getFileInfo(const Tokenizer &tokenizer, const Settings &settings) const
951951
{
952952
const std::list<CTU::FileInfo::UnsafeUsage> &unsafeArrayIndex = CTU::getUnsafeUsage(tokenizer, settings, isCtuUnsafeArrayIndex);
953953
const std::list<CTU::FileInfo::UnsafeUsage> &unsafePointerArith = CTU::getUnsafeUsage(tokenizer, settings, isCtuUnsafePointerArith);

lib/checkbufferoverrun.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ class CPPCHECKLIB CheckBufferOverrun : public Check {
9292
}
9393

9494
/** @brief Parse current TU and extract file info */
95-
Check::FileInfo *getFileInfo(const Tokenizer *tokenizer, const Settings *settings) const override;
95+
Check::FileInfo *getFileInfo(const Tokenizer &tokenizer, const Settings &settings) const override;
9696

9797
/** @brief Analyse all file infos for all TU */
9898
bool analyseWholeProgram(const CTU::FileInfo *ctu, const std::list<Check::FileInfo*> &fileInfo, const Settings& settings, ErrorLogger &errorLogger) override;
@@ -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 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);
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/checkclass.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3533,14 +3533,14 @@ namespace
35333533
};
35343534
}
35353535

3536-
Check::FileInfo *CheckClass::getFileInfo(const Tokenizer *tokenizer, const Settings *settings) const
3536+
Check::FileInfo *CheckClass::getFileInfo(const Tokenizer &tokenizer, const Settings& /*settings*/) const
35373537
{
3538-
if (!tokenizer->isCPP())
3538+
if (!tokenizer.isCPP())
35393539
return nullptr;
3540-
(void)settings;
3540+
35413541
// One definition rule
35423542
std::vector<MyFileInfo::NameLoc> classDefinitions;
3543-
for (const Scope * classScope : tokenizer->getSymbolDatabase()->classAndStructScopes) {
3543+
for (const Scope * classScope : tokenizer.getSymbolDatabase()->classAndStructScopes) {
35443544
if (classScope->isAnonymous())
35453545
continue;
35463546

@@ -3575,7 +3575,7 @@ Check::FileInfo *CheckClass::getFileInfo(const Tokenizer *tokenizer, const Setti
35753575

35763576
MyFileInfo::NameLoc nameLoc;
35773577
nameLoc.className = std::move(name);
3578-
nameLoc.fileName = tokenizer->list.file(classScope->classDef);
3578+
nameLoc.fileName = tokenizer.list.file(classScope->classDef);
35793579
nameLoc.lineNumber = classScope->classDef->linenr();
35803580
nameLoc.column = classScope->classDef->column();
35813581

lib/checkclass.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,7 @@ class CPPCHECKLIB CheckClass : public Check {
168168
void checkUnsafeClassRefMember();
169169

170170
/** @brief Parse current TU and extract file info */
171-
Check::FileInfo *getFileInfo(const Tokenizer *tokenizer, const Settings *settings) const override;
171+
Check::FileInfo *getFileInfo(const Tokenizer &tokenizer, const Settings &settings) const override;
172172

173173
Check::FileInfo * loadFileInfoFromXml(const tinyxml2::XMLElement *xmlElement) const override;
174174

lib/checkleakautovar.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -834,7 +834,7 @@ const Token * CheckLeakAutoVar::checkTokenInsideExpression(const Token * const t
834834
const std::map<int, VarInfo::AllocInfo>::const_iterator var = varInfo.alloctype.find(tok->varId());
835835
if (var != varInfo.alloctype.end()) {
836836
bool unknown = false;
837-
if (var->second.status == VarInfo::DEALLOC && CheckNullPointer::isPointerDeRef(tok, unknown, mSettings) && !unknown) {
837+
if (var->second.status == VarInfo::DEALLOC && CheckNullPointer::isPointerDeRef(tok, unknown, *mSettings) && !unknown) {
838838
deallocUseError(tok, tok->str());
839839
} else if (Token::simpleMatch(tok->tokAt(-2), "= &")) {
840840
varInfo.erase(tok->varId());

lib/checknullpointer.cpp

Lines changed: 22 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -62,28 +62,26 @@ static bool checkNullpointerFunctionCallPlausibility(const Function* func, unsig
6262
* @param var variables that the function read / write.
6363
* @param library --library files data
6464
*/
65-
void CheckNullPointer::parseFunctionCall(const Token &tok, std::list<const Token *> &var, const Library *library)
65+
void CheckNullPointer::parseFunctionCall(const Token &tok, std::list<const Token *> &var, const Library &library)
6666
{
6767
if (Token::Match(&tok, "%name% ( )") || !tok.tokAt(2))
6868
return;
6969

7070
const std::vector<const Token *> args = getArguments(&tok);
7171

72-
if (library || tok.function() != nullptr) {
73-
for (int argnr = 1; argnr <= args.size(); ++argnr) {
74-
const Token *param = args[argnr - 1];
75-
if (library && library->isnullargbad(&tok, argnr) && checkNullpointerFunctionCallPlausibility(tok.function(), argnr))
72+
for (int argnr = 1; argnr <= args.size(); ++argnr) {
73+
const Token *param = args[argnr - 1];
74+
if (library.isnullargbad(&tok, argnr) && checkNullpointerFunctionCallPlausibility(tok.function(), argnr))
75+
var.push_back(param);
76+
else if (tok.function()) {
77+
const Variable* argVar = tok.function()->getArgumentVar(argnr-1);
78+
if (argVar && argVar->isStlStringType() && !argVar->isArrayOrPointer())
7679
var.push_back(param);
77-
else if (tok.function()) {
78-
const Variable* argVar = tok.function()->getArgumentVar(argnr-1);
79-
if (argVar && argVar->isStlStringType() && !argVar->isArrayOrPointer())
80-
var.push_back(param);
81-
}
8280
}
8381
}
8482

85-
if (library && library->formatstr_function(&tok)) {
86-
const int formatStringArgNr = library->formatstr_argno(&tok);
83+
if (library.formatstr_function(&tok)) {
84+
const int formatStringArgNr = library.formatstr_argno(&tok);
8785
if (formatStringArgNr < 0 || formatStringArgNr >= args.size())
8886
return;
8987

@@ -95,7 +93,7 @@ void CheckNullPointer::parseFunctionCall(const Token &tok, std::list<const Token
9593
return;
9694
const std::string &formatString = args[formatStringArgNr]->strValue();
9795
int argnr = formatStringArgNr + 1;
98-
const bool scan = library->formatstr_scan(&tok);
96+
const bool scan = library.formatstr_scan(&tok);
9997

10098
bool percent = false;
10199
for (std::string::const_iterator i = formatString.cbegin(); i != formatString.cend(); ++i) {
@@ -148,15 +146,15 @@ namespace {
148146
*/
149147
bool CheckNullPointer::isPointerDeRef(const Token *tok, bool &unknown) const
150148
{
151-
return isPointerDeRef(tok, unknown, mSettings);
149+
return isPointerDeRef(tok, unknown, *mSettings);
152150
}
153151

154-
bool CheckNullPointer::isPointerDeRef(const Token *tok, bool &unknown, const Settings *settings)
152+
bool CheckNullPointer::isPointerDeRef(const Token *tok, bool &unknown, const Settings &settings)
155153
{
156154
unknown = false;
157155

158156
// Is pointer used as function parameter?
159-
if (Token::Match(tok->previous(), "[(,] %name% [,)]") && settings) {
157+
if (Token::Match(tok->previous(), "[(,] %name% [,)]")) {
160158
const Token *ftok = tok->previous();
161159
while (ftok && ftok->str() != "(") {
162160
if (ftok->str() == ")")
@@ -165,7 +163,7 @@ bool CheckNullPointer::isPointerDeRef(const Token *tok, bool &unknown, const Set
165163
}
166164
if (ftok && ftok->previous()) {
167165
std::list<const Token *> varlist;
168-
parseFunctionCall(*ftok->previous(), varlist, &settings->library);
166+
parseFunctionCall(*ftok->previous(), varlist, settings.library);
169167
if (std::find(varlist.cbegin(), varlist.cend(), tok) != varlist.cend()) {
170168
return true;
171169
}
@@ -263,7 +261,7 @@ bool CheckNullPointer::isPointerDeRef(const Token *tok, bool &unknown, const Set
263261
}
264262

265263

266-
static bool isNullablePointer(const Token* tok, const Settings* settings)
264+
static bool isNullablePointer(const Token* tok)
267265
{
268266
if (!tok)
269267
return false;
@@ -274,7 +272,7 @@ static bool isNullablePointer(const Token* tok, const Settings* settings)
274272
if (astIsSmartPointer(tok))
275273
return true;
276274
if (Token::simpleMatch(tok, "."))
277-
return isNullablePointer(tok->astOperand2(), settings);
275+
return isNullablePointer(tok->astOperand2());
278276
if (const Variable* var = tok->variable()) {
279277
return (var->isPointer() || var->isSmartPointer());
280278
}
@@ -294,8 +292,8 @@ void CheckNullPointer::nullPointerByDeRefAndChec()
294292
if (Token::Match(tok, "%num%|%char%|%str%"))
295293
continue;
296294

297-
if (!isNullablePointer(tok, mSettings) ||
298-
(tok->str() == "." && isNullablePointer(tok->astOperand2(), mSettings) && tok->astOperand2()->getValue(0))) // avoid duplicate warning
295+
if (!isNullablePointer(tok) ||
296+
(tok->str() == "." && isNullablePointer(tok->astOperand2()) && tok->astOperand2()->getValue(0))) // avoid duplicate warning
299297
continue;
300298

301299
// Can pointer be NULL?
@@ -367,7 +365,7 @@ void CheckNullPointer::nullConstantDereference()
367365
nullPointerError(tok);
368366
} else { // function call
369367
std::list<const Token *> var;
370-
parseFunctionCall(*tok, var, &mSettings->library);
368+
parseFunctionCall(*tok, var, mSettings->library);
371369

372370
// is one of the var items a NULL pointer?
373371
for (const Token *vartok : var) {
@@ -551,7 +549,7 @@ void CheckNullPointer::redundantConditionWarning(const Token* tok, const ValueFl
551549
}
552550

553551
// NOLINTNEXTLINE(readability-non-const-parameter) - used as callback so we need to preserve the signature
554-
static bool isUnsafeUsage(const Settings *settings, const Token *vartok, MathLib::bigint *value)
552+
static bool isUnsafeUsage(const Settings &settings, const Token *vartok, MathLib::bigint *value)
555553
{
556554
(void)value;
557555
bool unknown = false;
@@ -580,7 +578,7 @@ namespace
580578
};
581579
}
582580

583-
Check::FileInfo *CheckNullPointer::getFileInfo(const Tokenizer *tokenizer, const Settings *settings) const
581+
Check::FileInfo *CheckNullPointer::getFileInfo(const Tokenizer &tokenizer, const Settings &settings) const
584582
{
585583
const std::list<CTU::FileInfo::UnsafeUsage> &unsafeUsage = CTU::getUnsafeUsage(tokenizer, settings, isUnsafeUsage);
586584
if (unsafeUsage.empty())

lib/checknullpointer.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ class CPPCHECKLIB CheckNullPointer : public Check {
6767
*/
6868
bool isPointerDeRef(const Token *tok, bool &unknown) const;
6969

70-
static bool isPointerDeRef(const Token *tok, bool &unknown, const Settings *settings);
70+
static bool isPointerDeRef(const Token *tok, bool &unknown, const Settings &settings);
7171

7272
private:
7373
/**
@@ -78,7 +78,7 @@ class CPPCHECKLIB CheckNullPointer : public Check {
7878
*/
7979
static void parseFunctionCall(const Token &tok,
8080
std::list<const Token *> &var,
81-
const Library *library);
81+
const Library &library);
8282

8383
/** @brief This constructor is used when running checks. */
8484
CheckNullPointer(const Tokenizer *tokenizer, const Settings *settings, ErrorLogger *errorLogger)
@@ -106,7 +106,7 @@ class CPPCHECKLIB CheckNullPointer : public Check {
106106
void nullPointerError(const Token *tok, const std::string &varname, const ValueFlow::Value* value, bool inconclusive);
107107

108108
/** @brief Parse current TU and extract file info */
109-
Check::FileInfo *getFileInfo(const Tokenizer *tokenizer, const Settings *settings) const override;
109+
Check::FileInfo *getFileInfo(const Tokenizer &tokenizer, const Settings &settings) const override;
110110

111111
Check::FileInfo * loadFileInfoFromXml(const tinyxml2::XMLElement *xmlElement) const override;
112112

0 commit comments

Comments
 (0)