Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 6 additions & 7 deletions lib/check.h
Original file line number Diff line number Diff line change
Expand Up @@ -78,25 +78,24 @@ class CPPCHECKLIB Check {
/** Base class used for whole-program analysis */
class CPPCHECKLIB FileInfo {
public:
explicit FileInfo(std::string f0 = {}) : file0(std::move(f0)) {}
explicit FileInfo(std::string f0) : file0(std::move(f0)) {}
virtual ~FileInfo() = default;
virtual std::string toString() const {
return std::string();
}
virtual std::string toString() const = 0;
std::string file0;
};

virtual FileInfo * getFileInfo(const Tokenizer& /*tokenizer*/, const Settings& /*settings*/, const std::string& /*currentConfig*/) const {
virtual const FileInfo * getFileInfo(const Tokenizer& /*tokenizer*/, const Settings& /*settings*/, const std::string& /*currentConfig*/) const {
return nullptr;
}

virtual FileInfo * loadFileInfoFromXml(const tinyxml2::XMLElement *xmlElement) const {
virtual const FileInfo * loadFileInfoFromXml(const tinyxml2::XMLElement *xmlElement, const std::string& file0) const {
(void)xmlElement;
(void)file0;
return nullptr;
}

// Return true if an error is reported.
virtual bool analyseWholeProgram(const CTU::FileInfo& /*ctu*/, const std::list<FileInfo*>& /*fileInfo*/, const Settings& /*settings*/, ErrorLogger & /*errorLogger*/) {
virtual bool analyseWholeProgram(const CTU::FileInfo& /*ctu*/, const std::list<const FileInfo*>& /*fileInfo*/, const Settings& /*settings*/, ErrorLogger & /*errorLogger*/) {
return false;
}

Expand Down
10 changes: 6 additions & 4 deletions lib/checkbufferoverrun.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -900,6 +900,8 @@ namespace
/** data for multifile checking */
class MyFileInfo : public Check::FileInfo {
public:
explicit MyFileInfo(std::string f0) : Check::FileInfo(std::move(f0)) {}

using Check::FileInfo::FileInfo;
/** unsafe array index usage */
std::list<CTU::FileInfo::UnsafeUsage> unsafeArrayIndex;
Expand Down Expand Up @@ -952,7 +954,7 @@ bool CheckBufferOverrunImpl::isCtuUnsafePointerArith(const Settings &settings, c
}

/** @brief Parse current TU and extract file info */
Check::FileInfo *CheckBufferOverrun::getFileInfo(const Tokenizer &tokenizer, const Settings &settings, const std::string& /*currentConfig*/) const
const Check::FileInfo *CheckBufferOverrun::getFileInfo(const Tokenizer &tokenizer, const Settings &settings, const std::string& /*currentConfig*/) const
{
const std::list<CTU::FileInfo::UnsafeUsage> &unsafeArrayIndex = CTU::getUnsafeUsage(tokenizer, settings, CheckBufferOverrunImpl::isCtuUnsafeArrayIndex);
const std::list<CTU::FileInfo::UnsafeUsage> &unsafePointerArith = CTU::getUnsafeUsage(tokenizer, settings, CheckBufferOverrunImpl::isCtuUnsafePointerArith);
Expand All @@ -965,12 +967,12 @@ Check::FileInfo *CheckBufferOverrun::getFileInfo(const Tokenizer &tokenizer, con
return fileInfo;
}

Check::FileInfo * CheckBufferOverrun::loadFileInfoFromXml(const tinyxml2::XMLElement *xmlElement) const
const Check::FileInfo * CheckBufferOverrun::loadFileInfoFromXml(const tinyxml2::XMLElement *xmlElement, const std::string& file0) const
{
const std::string arrayIndex("array-index");
const std::string pointerArith("pointer-arith");

auto *fileInfo = new MyFileInfo;
auto *fileInfo = new MyFileInfo(file0);
for (const tinyxml2::XMLElement *e = xmlElement->FirstChildElement(); e; e = e->NextSiblingElement()) {
const char* name = e->Name();
if (name == arrayIndex)
Expand All @@ -988,7 +990,7 @@ Check::FileInfo * CheckBufferOverrun::loadFileInfoFromXml(const tinyxml2::XMLEle
}

/** @brief Analyse all file infos for all TU */
bool CheckBufferOverrun::analyseWholeProgram(const CTU::FileInfo &ctu, const std::list<Check::FileInfo*> &fileInfo, const Settings& settings, ErrorLogger &errorLogger)
bool CheckBufferOverrun::analyseWholeProgram(const CTU::FileInfo &ctu, const std::list<const Check::FileInfo*> &fileInfo, const Settings& settings, ErrorLogger &errorLogger)
{
CheckBufferOverrunImpl dummy(nullptr, settings, &errorLogger);
dummy.
Expand Down
6 changes: 3 additions & 3 deletions lib/checkbufferoverrun.h
Original file line number Diff line number Diff line change
Expand Up @@ -67,14 +67,14 @@ class CPPCHECKLIB CheckBufferOverrun : public Check {
void runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) override;

/** @brief Parse current TU and extract file info */
Check::FileInfo *getFileInfo(const Tokenizer &tokenizer, const Settings &settings, const std::string& /*currentConfig*/) const override;
const Check::FileInfo *getFileInfo(const Tokenizer &tokenizer, const Settings &settings, const std::string& /*currentConfig*/) const override;

/** @brief Analyse all file infos for all TU */
bool analyseWholeProgram(const CTU::FileInfo &ctu, const std::list<Check::FileInfo*> &fileInfo, const Settings& settings, ErrorLogger &errorLogger) override;
bool analyseWholeProgram(const CTU::FileInfo &ctu, const std::list<const Check::FileInfo*> &fileInfo, const Settings& settings, ErrorLogger &errorLogger) override;

void getErrorMessages(ErrorLogger *errorLogger, const Settings &settings) const override;

Check::FileInfo * loadFileInfoFromXml(const tinyxml2::XMLElement *xmlElement) const override;
const Check::FileInfo * loadFileInfoFromXml(const tinyxml2::XMLElement *xmlElement, const std::string& file0) const override;

std::string classInfo() const override {
return "Out of bounds checking:\n"
Expand Down
10 changes: 6 additions & 4 deletions lib/checkclass.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3693,6 +3693,8 @@ namespace
/* multifile checking; one definition rule violations */
class MyFileInfo : public Check::FileInfo {
public:
explicit MyFileInfo(std::string f0) : Check::FileInfo(std::move(f0)) {}

using Check::FileInfo::FileInfo;
struct NameLoc {
std::string className;
Expand Down Expand Up @@ -3728,7 +3730,7 @@ namespace
};
}

Check::FileInfo *CheckClass::getFileInfo(const Tokenizer &tokenizer, const Settings& /*settings*/, const std::string& currentConfig) const
const Check::FileInfo *CheckClass::getFileInfo(const Tokenizer &tokenizer, const Settings& /*settings*/, const std::string& currentConfig) const
{
if (!tokenizer.isCPP())
return nullptr;
Expand Down Expand Up @@ -3798,9 +3800,9 @@ Check::FileInfo *CheckClass::getFileInfo(const Tokenizer &tokenizer, const Setti
return fileInfo;
}

Check::FileInfo * CheckClass::loadFileInfoFromXml(const tinyxml2::XMLElement *xmlElement) const
const Check::FileInfo * CheckClass::loadFileInfoFromXml(const tinyxml2::XMLElement *xmlElement, const std::string& file0) const
{
auto *fileInfo = new MyFileInfo;
auto *fileInfo = new MyFileInfo(file0);
for (const tinyxml2::XMLElement *e = xmlElement->FirstChildElement(); e; e = e->NextSiblingElement()) {
if (std::strcmp(e->Name(), "class") != 0)
continue;
Expand Down Expand Up @@ -3828,7 +3830,7 @@ Check::FileInfo * CheckClass::loadFileInfoFromXml(const tinyxml2::XMLElement *xm
return fileInfo;
}

bool CheckClass::analyseWholeProgram(const CTU::FileInfo &ctu, const std::list<Check::FileInfo*> &fileInfo, const Settings& settings, ErrorLogger &errorLogger)
bool CheckClass::analyseWholeProgram(const CTU::FileInfo &ctu, const std::list<const Check::FileInfo*> &fileInfo, const Settings& settings, ErrorLogger &errorLogger)
{
(void)ctu;
(void)settings;
Expand Down
6 changes: 3 additions & 3 deletions lib/checkclass.h
Original file line number Diff line number Diff line change
Expand Up @@ -61,12 +61,12 @@ class CPPCHECKLIB CheckClass : public Check {
void runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) override;

/** @brief Parse current TU and extract file info */
Check::FileInfo *getFileInfo(const Tokenizer &tokenizer, const Settings& /*settings*/, const std::string& currentConfig) const override;
const Check::FileInfo *getFileInfo(const Tokenizer &tokenizer, const Settings& /*settings*/, const std::string& currentConfig) const override;

Check::FileInfo * loadFileInfoFromXml(const tinyxml2::XMLElement *xmlElement) const override;
const Check::FileInfo * loadFileInfoFromXml(const tinyxml2::XMLElement *xmlElement, const std::string& file0) const override;

/** @brief Analyse all file infos for all TU */
bool analyseWholeProgram(const CTU::FileInfo &ctu, const std::list<Check::FileInfo*> &fileInfo, const Settings& settings, ErrorLogger &errorLogger) override;
bool analyseWholeProgram(const CTU::FileInfo &ctu, const std::list<const Check::FileInfo*> &fileInfo, const Settings& settings, ErrorLogger &errorLogger) override;

void getErrorMessages(ErrorLogger *errorLogger, const Settings &settings) const override;

Expand Down
8 changes: 4 additions & 4 deletions lib/checknullpointer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -604,7 +604,7 @@ namespace
};
}

Check::FileInfo *CheckNullPointer::getFileInfo(const Tokenizer &tokenizer, const Settings &settings, const std::string& currentConfig) const
const Check::FileInfo *CheckNullPointer::getFileInfo(const Tokenizer &tokenizer, const Settings &settings, const std::string& currentConfig) const
{
(void)currentConfig;

Expand All @@ -617,18 +617,18 @@ Check::FileInfo *CheckNullPointer::getFileInfo(const Tokenizer &tokenizer, const
return fileInfo;
}

Check::FileInfo * CheckNullPointer::loadFileInfoFromXml(const tinyxml2::XMLElement *xmlElement) const
const Check::FileInfo * CheckNullPointer::loadFileInfoFromXml(const tinyxml2::XMLElement *xmlElement, const std::string& file0) const
{
const std::list<CTU::FileInfo::UnsafeUsage> &unsafeUsage = CTU::loadUnsafeUsageListFromXml(xmlElement);
if (unsafeUsage.empty())
return nullptr;

auto *fileInfo = new MyFileInfo;
auto *fileInfo = new MyFileInfo(file0);
fileInfo->unsafeUsage = unsafeUsage;
return fileInfo;
}

bool CheckNullPointer::analyseWholeProgram(const CTU::FileInfo &ctu, const std::list<Check::FileInfo*> &fileInfo, const Settings& settings, ErrorLogger &errorLogger)
bool CheckNullPointer::analyseWholeProgram(const CTU::FileInfo &ctu, const std::list<const Check::FileInfo*> &fileInfo, const Settings& settings, ErrorLogger &errorLogger)
{
(void)settings;

Expand Down
6 changes: 3 additions & 3 deletions lib/checknullpointer.h
Original file line number Diff line number Diff line change
Expand Up @@ -59,12 +59,12 @@ class CPPCHECKLIB CheckNullPointer : public Check {
void runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) override;

/** @brief Parse current TU and extract file info */
Check::FileInfo *getFileInfo(const Tokenizer &tokenizer, const Settings &settings, const std::string& currentConfig) const override;
const Check::FileInfo *getFileInfo(const Tokenizer &tokenizer, const Settings &settings, const std::string& currentConfig) const override;

Check::FileInfo * loadFileInfoFromXml(const tinyxml2::XMLElement *xmlElement) const override;
const Check::FileInfo * loadFileInfoFromXml(const tinyxml2::XMLElement *xmlElement, const std::string& file0) const override;

/** @brief Analyse all file infos for all TU */
bool analyseWholeProgram(const CTU::FileInfo &ctu, const std::list<Check::FileInfo*> &fileInfo, const Settings& settings, ErrorLogger &errorLogger) override;
bool analyseWholeProgram(const CTU::FileInfo &ctu, const std::list<const Check::FileInfo*> &fileInfo, const Settings& settings, ErrorLogger &errorLogger) override;

/** Get error messages. Used by --errorlist */
void getErrorMessages(ErrorLogger *errorLogger, const Settings &settings) const override;
Expand Down
8 changes: 4 additions & 4 deletions lib/checkuninitvar.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1727,7 +1727,7 @@ static bool isVariableUsage(const Settings &settings, const Token *argtok, CTU::
return isVariableUsage(settings, argtok, &value->value);
}

Check::FileInfo *CheckUninitVar::getFileInfo(const Tokenizer &tokenizer, const Settings &settings, const std::string& /*currentConfig*/) const
const Check::FileInfo *CheckUninitVar::getFileInfo(const Tokenizer &tokenizer, const Settings &settings, const std::string& /*currentConfig*/) const
{
const std::list<CTU::FileInfo::UnsafeUsage> &unsafeUsage = CTU::getUnsafeUsage(tokenizer, settings, ::isVariableUsage);
if (unsafeUsage.empty())
Expand All @@ -1738,18 +1738,18 @@ Check::FileInfo *CheckUninitVar::getFileInfo(const Tokenizer &tokenizer, const S
return fileInfo;
}

Check::FileInfo * CheckUninitVar::loadFileInfoFromXml(const tinyxml2::XMLElement *xmlElement) const
const Check::FileInfo * CheckUninitVar::loadFileInfoFromXml(const tinyxml2::XMLElement *xmlElement, const std::string& file0) const
{
const std::list<CTU::FileInfo::UnsafeUsage> &unsafeUsage = CTU::loadUnsafeUsageListFromXml(xmlElement);
if (unsafeUsage.empty())
return nullptr;

auto *fileInfo = new MyFileInfo;
auto *fileInfo = new MyFileInfo(file0);
fileInfo->unsafeUsage = unsafeUsage;
return fileInfo;
}

bool CheckUninitVar::analyseWholeProgram(const CTU::FileInfo &ctu, const std::list<Check::FileInfo*> &fileInfo, const Settings& settings, ErrorLogger &errorLogger)
bool CheckUninitVar::analyseWholeProgram(const CTU::FileInfo &ctu, const std::list<const Check::FileInfo*> &fileInfo, const Settings& settings, ErrorLogger &errorLogger)
{
(void)settings;

Expand Down
6 changes: 3 additions & 3 deletions lib/checkuninitvar.h
Original file line number Diff line number Diff line change
Expand Up @@ -69,12 +69,12 @@ class CPPCHECKLIB CheckUninitVar : public Check {
void runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger) override;

/** @brief Parse current TU and extract file info */
Check::FileInfo *getFileInfo(const Tokenizer &tokenizer, const Settings &settings, const std::string& /*currentConfig*/) const override;
const Check::FileInfo *getFileInfo(const Tokenizer &tokenizer, const Settings &settings, const std::string& /*currentConfig*/) const override;

Check::FileInfo * loadFileInfoFromXml(const tinyxml2::XMLElement *xmlElement) const override;
const Check::FileInfo * loadFileInfoFromXml(const tinyxml2::XMLElement *xmlElement, const std::string& file0) const override;

/** @brief Analyse all file infos for all TU */
bool analyseWholeProgram(const CTU::FileInfo &ctu, const std::list<Check::FileInfo*> &fileInfo, const Settings& settings, ErrorLogger &errorLogger) override;
bool analyseWholeProgram(const CTU::FileInfo &ctu, const std::list<const Check::FileInfo*> &fileInfo, const Settings& settings, ErrorLogger &errorLogger) override;

void getErrorMessages(ErrorLogger* errorLogger, const Settings& settings) const override;

Expand Down
11 changes: 5 additions & 6 deletions lib/cppcheck.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1378,7 +1378,7 @@ void CppCheck::checkNormalTokens(const Tokenizer &tokenizer, AnalyzerInformation
if (mSettings.useSingleJob() || analyzerInformation) {
// Analyse the tokens..
{
CTU::FileInfo * const fi1 = CTU::getFileInfo(tokenizer);
const CTU::FileInfo * const fi1 = CTU::getFileInfo(tokenizer);
if (analyzerInformation)
analyzerInformation->setFileInfo("ctu", fi1->toString());
if (mSettings.useSingleJob())
Expand All @@ -1389,7 +1389,7 @@ void CppCheck::checkNormalTokens(const Tokenizer &tokenizer, AnalyzerInformation

if (!doUnusedFunctionOnly) {
for (const Check * const c : CheckInstances::get()) {
if (Check::FileInfo * const fi = c->getFileInfo(tokenizer, mSettings, currentConfig)) {
if (const Check::FileInfo * const fi = c->getFileInfo(tokenizer, mSettings, currentConfig)) {
if (analyzerInformation)
analyzerInformation->setFileInfo(c->name(), fi->toString());
if (mSettings.useSingleJob())
Expand Down Expand Up @@ -1854,7 +1854,7 @@ unsigned int CppCheck::analyseWholeProgram(const std::string &buildDir, const st

executeAddonsWholeProgram(files, fileSettings, ctuInfo);

std::list<Check::FileInfo*> fileInfoList;
std::list<const Check::FileInfo*> fileInfoList;
CTU::FileInfo ctuFileInfo;

const auto handler = [&fileInfoList, &ctuFileInfo](const char* checkattr, const tinyxml2::XMLElement* e, const AnalyzerInformation::Info& filesTxtInfo) {
Expand All @@ -1864,8 +1864,7 @@ unsigned int CppCheck::analyseWholeProgram(const std::string &buildDir, const st
}
for (const Check *check : CheckInstances::get()) {
if (checkattr == check->name()) {
if (Check::FileInfo* fi = check->loadFileInfoFromXml(e)) {
fi->file0 = filesTxtInfo.sourceFile;
if (const Check::FileInfo* fi = check->loadFileInfoFromXml(e, filesTxtInfo.sourceFile)) {
fileInfoList.push_back(fi);
}
}
Expand All @@ -1883,7 +1882,7 @@ unsigned int CppCheck::analyseWholeProgram(const std::string &buildDir, const st
c->analyseWholeProgram(ctuFileInfo, fileInfoList, mSettings, mErrorLogger);
}

for (Check::FileInfo *fi : fileInfoList)
for (const Check::FileInfo *fi : fileInfoList)
delete fi;

return mLogger->exitcode();
Expand Down
2 changes: 1 addition & 1 deletion lib/cppcheck.h
Original file line number Diff line number Diff line change
Expand Up @@ -250,7 +250,7 @@ class CPPCHECKLIB CppCheck {
bool mUseGlobalSuppressions;

/** File info used for whole program analysis */
std::list<Check::FileInfo*> mFileInfo;
std::list<const Check::FileInfo*> mFileInfo;

/** Callback for executing a shell command (exe, args, output) */
ExecuteCmdFn mExecuteCommand;
Expand Down
2 changes: 1 addition & 1 deletion lib/ctu.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -310,7 +310,7 @@ static int isCallFunction(const Scope *scope, int argnr, const Token *&tok)
}


CTU::FileInfo *CTU::getFileInfo(const Tokenizer &tokenizer)
const CTU::FileInfo *CTU::getFileInfo(const Tokenizer &tokenizer)
{
const SymbolDatabase * const symbolDatabase = tokenizer.getSymbolDatabase();

Expand Down
4 changes: 3 additions & 1 deletion lib/ctu.h
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,8 @@ namespace tinyxml2 {
namespace CTU {
class CPPCHECKLIB FileInfo : public Check::FileInfo {
public:
FileInfo() : Check::FileInfo("") {}

enum class InvalidValueType : std::uint8_t { null, uninit, bufferOverflow };

std::string toString() const override;
Expand Down Expand Up @@ -160,7 +162,7 @@ namespace CTU {
CPPCHECKLIB std::string getFunctionId(const Tokenizer &tokenizer, const Function *function);

/** @brief Parse current TU and extract file info */
CPPCHECKLIB RET_NONNULL FileInfo *getFileInfo(const Tokenizer &tokenizer);
CPPCHECKLIB RET_NONNULL const FileInfo *getFileInfo(const Tokenizer &tokenizer);

CPPCHECKLIB std::list<FileInfo::UnsafeUsage> getUnsafeUsage(const Tokenizer &tokenizer, const Settings &settings, bool (*isUnsafeUsage)(const Settings &settings, const Token *argtok, FileInfo::Value *value));

Expand Down
4 changes: 2 additions & 2 deletions test/testbufferoverrun.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5361,9 +5361,9 @@ class TestBufferOverrun : public TestFixture {
SimpleTokenizer tokenizer(settings0, *this);
ASSERT_LOC(tokenizer.tokenize(code), file, line);

CTU::FileInfo *ctu = CTU::getFileInfo(tokenizer);
const CTU::FileInfo *ctu = CTU::getFileInfo(tokenizer);

std::list<Check::FileInfo*> fileInfo;
std::list<const Check::FileInfo*> fileInfo;
CheckBufferOverrun check;
Check& c = getCheck(check);
fileInfo.push_back(c.getFileInfo(tokenizer, settings0, ""));
Expand Down
4 changes: 2 additions & 2 deletions test/testclass.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9282,7 +9282,7 @@ class TestClass : public TestFixture {
Check &check = getCheck(checkClass);

// getFileInfo
std::list<Check::FileInfo*> fileInfo;
std::list<const Check::FileInfo*> fileInfo;
for (const std::string& c: code) {
const std::string filename = std::to_string(fileInfo.size()) + ".cpp";
SimpleTokenizer tokenizer{settingsDefault, *this, filename};
Expand Down Expand Up @@ -9333,7 +9333,7 @@ class TestClass : public TestFixture {

CheckClass check;
const Check& c = getCheck(check);
Check::FileInfo * fileInfo = (c.getFileInfo)(tokenizer, settings1, "");
const Check::FileInfo * fileInfo = (c.getFileInfo)(tokenizer, settings1, "");

delete fileInfo;
}
Expand Down
4 changes: 2 additions & 2 deletions test/testnullpointer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4690,11 +4690,11 @@ class TestNullPointer : public TestFixture {
SimpleTokenizer tokenizer(settings, *this);
ASSERT_LOC(tokenizer.tokenize(code), file, line);

CTU::FileInfo *ctu = CTU::getFileInfo(tokenizer);
const CTU::FileInfo *ctu = CTU::getFileInfo(tokenizer);

CheckNullPointer check;
Check& c = getCheck(check);
std::list<Check::FileInfo*> fileInfo;
std::list<const Check::FileInfo*> fileInfo;
fileInfo.push_back(c.getFileInfo(tokenizer, settings, ""));
c.analyseWholeProgram(*ctu, fileInfo, settings, *this); // TODO: check result
while (!fileInfo.empty()) {
Expand Down
Loading
Loading