Skip to content

Commit 77a6705

Browse files
Fix #13523 CTU: Mention including cpp file for error in header (danmar#7174)
1 parent 01b6141 commit 77a6705

File tree

11 files changed

+71
-15
lines changed

11 files changed

+71
-15
lines changed

lib/check.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,11 +102,12 @@ class CPPCHECKLIB Check {
102102
/** Base class used for whole-program analysis */
103103
class CPPCHECKLIB FileInfo {
104104
public:
105-
FileInfo() = default;
105+
explicit FileInfo(std::string f0 = {}) : file0(std::move(f0)) {}
106106
virtual ~FileInfo() = default;
107107
virtual std::string toString() const {
108108
return std::string();
109109
}
110+
std::string file0;
110111
};
111112

112113
virtual FileInfo * getFileInfo(const Tokenizer& /*tokenizer*/, const Settings& /*settings*/) const {

lib/checkbufferoverrun.cpp

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -893,6 +893,7 @@ namespace
893893
/** data for multifile checking */
894894
class MyFileInfo : public Check::FileInfo {
895895
public:
896+
using Check::FileInfo::FileInfo;
896897
/** unsafe array index usage */
897898
std::list<CTU::FileInfo::UnsafeUsage> unsafeArrayIndex;
898899

@@ -951,7 +952,7 @@ Check::FileInfo *CheckBufferOverrun::getFileInfo(const Tokenizer &tokenizer, con
951952
if (unsafeArrayIndex.empty() && unsafePointerArith.empty()) {
952953
return nullptr;
953954
}
954-
auto *fileInfo = new MyFileInfo;
955+
auto *fileInfo = new MyFileInfo(tokenizer.list.getFiles()[0]);
955956
fileInfo->unsafeArrayIndex = unsafeArrayIndex;
956957
fileInfo->unsafePointerArith = unsafePointerArith;
957958
return fileInfo;
@@ -998,14 +999,15 @@ bool CheckBufferOverrun::analyseWholeProgram(const CTU::FileInfo *ctu, const std
998999
if (!fi)
9991000
continue;
10001001
for (const CTU::FileInfo::UnsafeUsage &unsafeUsage : fi->unsafeArrayIndex)
1001-
foundErrors |= analyseWholeProgram1(callsMap, unsafeUsage, 1, errorLogger, settings.maxCtuDepth);
1002+
foundErrors |= analyseWholeProgram1(callsMap, unsafeUsage, 1, errorLogger, settings.maxCtuDepth, fi->file0);
10021003
for (const CTU::FileInfo::UnsafeUsage &unsafeUsage : fi->unsafePointerArith)
1003-
foundErrors |= analyseWholeProgram1(callsMap, unsafeUsage, 2, errorLogger, settings.maxCtuDepth);
1004+
foundErrors |= analyseWholeProgram1(callsMap, unsafeUsage, 2, errorLogger, settings.maxCtuDepth, fi->file0);
10041005
}
10051006
return foundErrors;
10061007
}
10071008

1008-
bool CheckBufferOverrun::analyseWholeProgram1(const std::map<std::string, std::list<const CTU::FileInfo::CallBase *>> &callsMap, const CTU::FileInfo::UnsafeUsage &unsafeUsage, int type, ErrorLogger &errorLogger, int maxCtuDepth)
1009+
bool CheckBufferOverrun::analyseWholeProgram1(const std::map<std::string, std::list<const CTU::FileInfo::CallBase *>> &callsMap, const CTU::FileInfo::UnsafeUsage &unsafeUsage,
1010+
int type, ErrorLogger &errorLogger, int maxCtuDepth, const std::string& file0)
10091011
{
10101012
const CTU::FileInfo::FunctionCall *functionCall = nullptr;
10111013

@@ -1038,7 +1040,7 @@ bool CheckBufferOverrun::analyseWholeProgram1(const std::map<std::string, std::l
10381040
}
10391041

10401042
const ErrorMessage errorMessage(locationList,
1041-
emptyString,
1043+
file0,
10421044
Severity::error,
10431045
errmsg,
10441046
errorId,

lib/checkbufferoverrun.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,8 @@ class CPPCHECKLIB CheckBufferOverrun : public Check {
112112
static bool isCtuUnsafePointerArith(const Settings &settings, const Token *argtok, MathLib::bigint *offset);
113113

114114
Check::FileInfo * loadFileInfoFromXml(const tinyxml2::XMLElement *xmlElement) const override;
115-
static bool analyseWholeProgram1(const std::map<std::string, std::list<const CTU::FileInfo::CallBase *>> &callsMap, const CTU::FileInfo::UnsafeUsage &unsafeUsage, int type, ErrorLogger &errorLogger, int maxCtuDepth);
115+
static bool analyseWholeProgram1(const std::map<std::string, std::list<const CTU::FileInfo::CallBase *>> &callsMap, const CTU::FileInfo::UnsafeUsage &unsafeUsage,
116+
int type, ErrorLogger &errorLogger, int maxCtuDepth, const std::string& file0);
116117

117118

118119
static std::string myName() {

lib/checkclass.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3566,6 +3566,7 @@ namespace
35663566
/* multifile checking; one definition rule violations */
35673567
class MyFileInfo : public Check::FileInfo {
35683568
public:
3569+
using Check::FileInfo::FileInfo;
35693570
struct NameLoc {
35703571
std::string className;
35713572
std::string fileName;
@@ -3662,7 +3663,7 @@ Check::FileInfo *CheckClass::getFileInfo(const Tokenizer &tokenizer, const Setti
36623663
if (classDefinitions.empty())
36633664
return nullptr;
36643665

3665-
auto *fileInfo = new MyFileInfo;
3666+
auto *fileInfo = new MyFileInfo(tokenizer.list.getFiles()[0]);
36663667
fileInfo->classDefinitions.swap(classDefinitions);
36673668
return fileInfo;
36683669
}
@@ -3728,7 +3729,7 @@ bool CheckClass::analyseWholeProgram(const CTU::FileInfo *ctu, const std::list<C
37283729
locationList.emplace_back(it->second.fileName, it->second.lineNumber, it->second.column);
37293730

37303731
const ErrorMessage errmsg(std::move(locationList),
3731-
emptyString,
3732+
fi->file0,
37323733
Severity::error,
37333734
"$symbol:" + nameLoc.className +
37343735
"\nThe one definition rule is violated, different classes/structs have the same name '$symbol'",

lib/checknullpointer.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -600,6 +600,7 @@ namespace
600600
/* data for multifile checking */
601601
class MyFileInfo : public Check::FileInfo {
602602
public:
603+
using Check::FileInfo::FileInfo;
603604
/** function arguments that are dereferenced without checking if they are null */
604605
std::list<CTU::FileInfo::UnsafeUsage> unsafeUsage;
605606

@@ -617,7 +618,7 @@ Check::FileInfo *CheckNullPointer::getFileInfo(const Tokenizer &tokenizer, const
617618
if (unsafeUsage.empty())
618619
return nullptr;
619620

620-
auto *fileInfo = new MyFileInfo;
621+
auto *fileInfo = new MyFileInfo(tokenizer.list.getFiles()[0]);
621622
fileInfo->unsafeUsage = unsafeUsage;
622623
return fileInfo;
623624
}
@@ -667,7 +668,7 @@ bool CheckNullPointer::analyseWholeProgram(const CTU::FileInfo *ctu, const std::
667668
continue;
668669

669670
const ErrorMessage errmsg(locationList,
670-
emptyString,
671+
fi->file0,
671672
warning ? Severity::warning : Severity::error,
672673
"Null pointer dereference: " + unsafeUsage.myArgumentName,
673674
"ctunullpointer",

lib/checkuninitvar.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1708,6 +1708,7 @@ namespace
17081708
/* data for multifile checking */
17091709
class MyFileInfo : public Check::FileInfo {
17101710
public:
1711+
using Check::FileInfo::FileInfo;
17111712
/** function arguments that data are unconditionally read */
17121713
std::list<CTU::FileInfo::UnsafeUsage> unsafeUsage;
17131714

@@ -1725,7 +1726,7 @@ Check::FileInfo *CheckUninitVar::getFileInfo(const Tokenizer &tokenizer, const S
17251726
if (unsafeUsage.empty())
17261727
return nullptr;
17271728

1728-
auto *fileInfo = new MyFileInfo;
1729+
auto *fileInfo = new MyFileInfo(tokenizer.list.getFiles()[0]);
17291730
fileInfo->unsafeUsage = unsafeUsage;
17301731
return fileInfo;
17311732
}
@@ -1769,7 +1770,7 @@ bool CheckUninitVar::analyseWholeProgram(const CTU::FileInfo *ctu, const std::li
17691770
continue;
17701771

17711772
const ErrorMessage errmsg(locationList,
1772-
emptyString,
1773+
fi->file0,
17731774
Severity::error,
17741775
"Using argument " + unsafeUsage.myArgumentName + " that points at uninitialized variable " + functionCall->callArgumentExpression,
17751776
"ctuuninitvar",

lib/cppcheck.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2041,8 +2041,11 @@ unsigned int CppCheck::analyseWholeProgram(const std::string &buildDir, const st
20412041
}
20422042
// cppcheck-suppress shadowFunction - TODO: fix this
20432043
for (const Check *check : Check::instances()) {
2044-
if (checkClassAttr == check->name())
2045-
fileInfoList.push_back(check->loadFileInfoFromXml(e));
2044+
if (checkClassAttr == check->name()) {
2045+
Check::FileInfo* fi = check->loadFileInfoFromXml(e);
2046+
fi->file0 = filesTxtLine.substr(firstColon + 2);
2047+
fileInfoList.push_back(fi);
2048+
}
20462049
}
20472050
}
20482051
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
#include "nullpointer1.h"
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
#include "nullpointer1_1.h"
2+
3+
template<typename T>
4+
void f(T* p) {
5+
if (sizeof(T) == 4)
6+
p = nullptr;
7+
g(p);
8+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
template<typename T>
2+
void g(T* p) {
3+
*p = 0;
4+
};

0 commit comments

Comments
 (0)