Skip to content
Open
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
2 changes: 1 addition & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -649,7 +649,7 @@ $(libcppdir)/settings.o: lib/settings.cpp externals/picojson/picojson.h lib/addo
$(libcppdir)/standards.o: lib/standards.cpp externals/simplecpp/simplecpp.h lib/config.h lib/standards.h lib/utils.h
$(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/standards.cpp

$(libcppdir)/summaries.o: lib/summaries.cpp lib/addoninfo.h lib/analyzerinfo.h lib/checkers.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/summaries.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h
$(libcppdir)/summaries.o: lib/summaries.cpp lib/addoninfo.h lib/analyzerinfo.h lib/checkers.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/summaries.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h
$(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/summaries.cpp

$(libcppdir)/suppressions.o: lib/suppressions.cpp externals/tinyxml2/tinyxml2.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/mathlib.h lib/path.h lib/pathmatch.h lib/platform.h lib/smallvector.h lib/standards.h lib/suppressions.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h lib/xml.h
Expand Down
2 changes: 1 addition & 1 deletion gui/checkthread.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -238,7 +238,7 @@ void CheckThread::runAddonsAndTools(const Settings& settings, const FileSettings

const std::string &buildDir = settings.buildDir;
if (!buildDir.empty()) {
analyzerInfoFile = QString::fromStdString(AnalyzerInformation::getAnalyzerInfoFile(buildDir, fileSettings->filename(), fileSettings->cfg, fileSettings->fileIndex));
analyzerInfoFile = QString::fromStdString(AnalyzerInformation::getAnalyzerInfoFile(buildDir, fileSettings->sfilename(), fileSettings->cfg, fileSettings->file.fsFileId()));

QStringList args2(args);
args2.insert(0,"-E");
Expand Down
14 changes: 7 additions & 7 deletions lib/analyzerinfo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ std::string AnalyzerInformation::getFilesTxt(const std::list<std::string> &sourc

for (const FileSettings &fs : fileSettings) {
const std::string afile = getFilename(fs.filename());
const std::string id = fs.fileIndex > 0 ? std::to_string(fs.fileIndex) : "";
const std::string id = fs.file.fsFileId() > 0 ? std::to_string(fs.file.fsFileId()) : "";
ret << afile << ".a" << (++fileCount[afile]) << sep << fs.cfg << sep << id << sep << Path::simplifyPath(fs.filename()) << std::endl;
}

Expand Down Expand Up @@ -128,11 +128,11 @@ std::string AnalyzerInformation::getAnalyzerInfoFileFromFilesTxt(std::istream& f
return "";
}

std::string AnalyzerInformation::getAnalyzerInfoFile(const std::string &buildDir, const std::string &sourcefile, const std::string &cfg, int fileIndex)
std::string AnalyzerInformation::getAnalyzerInfoFile(const std::string &buildDir, const std::string &sourcefile, const std::string &cfg, std::size_t fsFileId)
{
std::ifstream fin(Path::join(buildDir, "files.txt"));
if (fin.is_open()) {
const std::string& ret = getAnalyzerInfoFileFromFilesTxt(fin, sourcefile, cfg, fileIndex);
const std::string& ret = getAnalyzerInfoFileFromFilesTxt(fin, sourcefile, cfg, fsFileId);
if (!ret.empty())
return Path::join(buildDir, ret);
}
Expand All @@ -146,13 +146,13 @@ std::string AnalyzerInformation::getAnalyzerInfoFile(const std::string &buildDir
return Path::join(buildDir, std::move(filename)) + ".analyzerinfo";
}

bool AnalyzerInformation::analyzeFile(const std::string &buildDir, const std::string &sourcefile, const std::string &cfg, int fileIndex, std::size_t hash, std::list<ErrorMessage> &errors)
bool AnalyzerInformation::analyzeFile(const std::string &buildDir, const std::string &sourcefile, const std::string &cfg, std::size_t fsFileId, std::size_t hash, std::list<ErrorMessage> &errors)
{
if (buildDir.empty() || sourcefile.empty())
return true;
close();

mAnalyzerInfoFile = AnalyzerInformation::getAnalyzerInfoFile(buildDir,sourcefile,cfg,fileIndex);
mAnalyzerInfoFile = AnalyzerInformation::getAnalyzerInfoFile(buildDir,sourcefile,cfg,fsFileId);

tinyxml2::XMLDocument analyzerInfoDoc;
const tinyxml2::XMLError xmlError = analyzerInfoDoc.LoadFile(mAnalyzerInfoFile.c_str());
Expand Down Expand Up @@ -194,10 +194,10 @@ bool AnalyzerInformation::Info::parse(const std::string& filesTxtLine) {
return false;

if (sep3 == sep2 + 1)
fileIndex = 0;
fsFileId = 0;
else {
try {
fileIndex = std::stoi(filesTxtLine.substr(sep2+1, sep3-sep2-1));
fsFileId = std::stoi(filesTxtLine.substr(sep2+1, sep3-sep2-1));
} catch (const std::exception&) {
return false;
}
Expand Down
6 changes: 3 additions & 3 deletions lib/analyzerinfo.h
Original file line number Diff line number Diff line change
Expand Up @@ -61,10 +61,10 @@ class CPPCHECKLIB AnalyzerInformation {

/** Close current TU.analyzerinfo file */
void close();
bool analyzeFile(const std::string &buildDir, const std::string &sourcefile, const std::string &cfg, int fileIndex, std::size_t hash, std::list<ErrorMessage> &errors);
bool analyzeFile(const std::string &buildDir, const std::string &sourcefile, const std::string &cfg, std::size_t fsFileId, std::size_t hash, std::list<ErrorMessage> &errors);
void reportErr(const ErrorMessage &msg);
void setFileInfo(const std::string &check, const std::string &fileInfo);
static std::string getAnalyzerInfoFile(const std::string &buildDir, const std::string &sourcefile, const std::string &cfg, int fileIndex);
static std::string getAnalyzerInfoFile(const std::string &buildDir, const std::string &sourcefile, const std::string &cfg, std::size_t fsFileId);

static const char sep = ':';

Expand All @@ -73,7 +73,7 @@ class CPPCHECKLIB AnalyzerInformation {
bool parse(const std::string& filesTxtLine);
std::string afile;
std::string cfg;
int fileIndex = 0;
std::size_t fsFileId = 0;
std::string sourceFile;
};

Expand Down
53 changes: 26 additions & 27 deletions lib/cppcheck.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -332,17 +332,17 @@ static std::vector<std::string> split(const std::string &str, const std::string
return ret;
}

static std::string getDumpFileName(const Settings& settings, const std::string& filename, int fileIndex)
static std::string getDumpFileName(const Settings& settings, const FileWithDetails& file)
{
std::string extension = ".dump";
if (fileIndex > 0)
extension = "." + std::to_string(fileIndex) + extension;
if (file.fsFileId() > 0)
extension = "." + std::to_string(file.fsFileId()) + extension;
if (!settings.dump && settings.buildDir.empty())
extension = "." + std::to_string(settings.pid) + extension;

if (!settings.dump && !settings.buildDir.empty())
return AnalyzerInformation::getAnalyzerInfoFile(settings.buildDir, filename, "", fileIndex) + extension;
return filename + extension;
return AnalyzerInformation::getAnalyzerInfoFile(settings.buildDir, file.spath(), "", file.fsFileId()) + extension;
return file.spath() + extension;
}

static std::string getCtuInfoFileName(const std::string &dumpFile)
Expand All @@ -352,13 +352,12 @@ static std::string getCtuInfoFileName(const std::string &dumpFile)

static void createDumpFile(const Settings& settings,
const FileWithDetails& file,
int fileIndex,
std::ofstream& fdump,
std::string& dumpFile)
{
if (!settings.dump && settings.addons.empty())
return;
dumpFile = getDumpFileName(settings, file.spath(), fileIndex);
dumpFile = getDumpFileName(settings, file);

fdump.open(dumpFile);
if (!fdump.is_open())
Expand Down Expand Up @@ -660,7 +659,7 @@ static std::string getClangFlags(const Settings& setting, Standards::Language la
}

// TODO: clear error list before returning
unsigned int CppCheck::checkClang(const FileWithDetails &file, int fileIndex)
unsigned int CppCheck::checkClang(const FileWithDetails &file)
{
// TODO: clear exitcode

Expand All @@ -673,7 +672,7 @@ unsigned int CppCheck::checkClang(const FileWithDetails &file, int fileIndex)
// TODO: get language from FileWithDetails object
std::string clangStderr;
if (!mSettings.buildDir.empty())
clangStderr = AnalyzerInformation::getAnalyzerInfoFile(mSettings.buildDir, file.spath(), "", fileIndex) + ".clang-stderr";
clangStderr = AnalyzerInformation::getAnalyzerInfoFile(mSettings.buildDir, file.spath(), "", file.fsFileId()) + ".clang-stderr";

std::string exe = mSettings.clangExecutable;
#ifdef _WIN32
Expand Down Expand Up @@ -747,7 +746,7 @@ unsigned int CppCheck::checkClang(const FileWithDetails &file, int fileIndex)
// create dumpfile
std::ofstream fdump;
std::string dumpFile;
createDumpFile(mSettings, file, fileIndex, fdump, dumpFile);
createDumpFile(mSettings, file, fdump, dumpFile);
if (fdump.is_open()) {
fdump << getLibraryDumpData();
// TODO: use tinyxml2 to create XML
Expand Down Expand Up @@ -791,9 +790,9 @@ unsigned int CppCheck::check(const FileWithDetails &file)

unsigned int returnValue;
if (mSettings.clang)
returnValue = checkClang(file, 0);
returnValue = checkClang(file);
else
returnValue = checkFile(file, "", 0);
returnValue = checkFile(file, "");

// TODO: call analyseClangTidy()

Expand All @@ -802,7 +801,7 @@ unsigned int CppCheck::check(const FileWithDetails &file)

unsigned int CppCheck::checkBuffer(const FileWithDetails &file, const char* data, std::size_t size)
{
return checkBuffer(file, "", 0, data, size);
return checkBuffer(file, "", data, size);
}

unsigned int CppCheck::check(const FileSettings &fs)
Expand Down Expand Up @@ -838,7 +837,7 @@ unsigned int CppCheck::check(const FileSettings &fs)
}
// need to pass the externally provided ErrorLogger instead of our internal wrapper
CppCheck temp(tempSettings, mSuppressions, mErrorLoggerDirect, mUseGlobalSuppressions, mExecuteCommand);
const unsigned int returnValue = temp.checkFile(fs.file, fs.cfg, fs.fileIndex);
const unsigned int returnValue = temp.checkFile(fs.file, fs.cfg);
if (mUnusedFunctionsCheck)
mUnusedFunctionsCheck->updateFunctionData(*temp.mUnusedFunctionsCheck);
while (!temp.mFileInfo.empty()) {
Expand Down Expand Up @@ -875,20 +874,20 @@ std::size_t CppCheck::calculateHash(const Preprocessor& preprocessor, const std:
return preprocessor.calculateHash(toolinfo.str());
}

unsigned int CppCheck::checkBuffer(const FileWithDetails &file, const std::string &cfgname, int fileIndex, const char* data, std::size_t size)
unsigned int CppCheck::checkBuffer(const FileWithDetails &file, const std::string &cfgname, const char* data, std::size_t size)
{
const auto f = [&file, data, size](std::vector<std::string>& files, simplecpp::OutputList* outputList) {
return simplecpp::TokenList{{data, size}, files, file.spath(), outputList};
};
return checkInternal(file, cfgname, fileIndex, f);
return checkInternal(file, cfgname, f);
}

unsigned int CppCheck::checkFile(const FileWithDetails& file, const std::string &cfgname, int fileIndex)
unsigned int CppCheck::checkFile(const FileWithDetails& file, const std::string &cfgname)
{
const auto f = [&file](std::vector<std::string>& files, simplecpp::OutputList* outputList) {
return simplecpp::TokenList{file.spath(), files, outputList};
};
return checkInternal(file, cfgname, fileIndex, f);
return checkInternal(file, cfgname, f);
}

void CppCheck::checkPlistOutput(const FileWithDetails& file, const std::vector<std::string>& files)
Expand All @@ -906,7 +905,7 @@ void CppCheck::checkPlistOutput(const FileWithDetails& file, const std::vector<s
}
}

unsigned int CppCheck::checkInternal(const FileWithDetails& file, const std::string &cfgname, int fileIndex, const CreateTokenListFn& createTokenList)
unsigned int CppCheck::checkInternal(const FileWithDetails& file, const std::string &cfgname, const CreateTokenListFn& createTokenList)
{
// TODO: move to constructor when CppCheck no longer owns the settings
if (mSettings.checks.isEnabled(Checks::unusedFunction) && !mUnusedFunctionsCheck)
Expand Down Expand Up @@ -974,7 +973,7 @@ unsigned int CppCheck::checkInternal(const FileWithDetails& file, const std::str
mLogger->setAnalyzerInfo(nullptr);

std::list<ErrorMessage> errors;
analyzerInformation->analyzeFile(mSettings.buildDir, file.spath(), cfgname, fileIndex, hash, errors);
analyzerInformation->analyzeFile(mSettings.buildDir, file.spath(), cfgname, file.fsFileId(), hash, errors);
analyzerInformation->setFileInfo("CheckUnusedFunctions", mUnusedFunctionsCheck->analyzerInfo(tokenizer));
analyzerInformation->close();
}
Expand Down Expand Up @@ -1020,7 +1019,7 @@ unsigned int CppCheck::checkInternal(const FileWithDetails& file, const std::str
// Calculate hash so it can be compared with old hash / future hashes
const std::size_t hash = calculateHash(preprocessor, file.spath());
std::list<ErrorMessage> errors;
if (!analyzerInformation->analyzeFile(mSettings.buildDir, file.spath(), cfgname, fileIndex, hash, errors)) {
if (!analyzerInformation->analyzeFile(mSettings.buildDir, file.spath(), cfgname, file.fsFileId(), hash, errors)) {
while (!errors.empty()) {
mErrorLogger.reportErr(errors.front());
errors.pop_front();
Expand Down Expand Up @@ -1077,7 +1076,7 @@ unsigned int CppCheck::checkInternal(const FileWithDetails& file, const std::str
// write dump file xml prolog
std::ofstream fdump;
std::string dumpFile;
createDumpFile(mSettings, file, fileIndex, fdump, dumpFile);
createDumpFile(mSettings, file, fdump, dumpFile);
if (fdump.is_open()) {
fdump << getLibraryDumpData();
fdump << dumpProlog;
Expand Down Expand Up @@ -1201,7 +1200,7 @@ unsigned int CppCheck::checkInternal(const FileWithDetails& file, const std::str
#endif

// Simplify tokens into normal form, skip rest of iteration if failed
if (!tokenizer.simplifyTokens1(currentConfig, fileIndex))
if (!tokenizer.simplifyTokens1(currentConfig, file.fsFileId()))
continue;

// dump xml if --dump
Expand Down Expand Up @@ -1641,12 +1640,12 @@ void CppCheck::executeAddonsWholeProgram(const std::list<FileWithDetails> &files

std::vector<std::string> ctuInfoFiles;
for (const auto &f: files) {
const std::string &dumpFileName = getDumpFileName(mSettings, f.path(), 0);
const std::string &dumpFileName = getDumpFileName(mSettings, f);
ctuInfoFiles.push_back(getCtuInfoFileName(dumpFileName));
}

for (const auto &f: fileSettings) {
const std::string &dumpFileName = getDumpFileName(mSettings, f.filename(), f.fileIndex);
for (const auto &fs: fileSettings) {
const std::string &dumpFileName = getDumpFileName(mSettings, fs.file);
ctuInfoFiles.push_back(getCtuInfoFileName(dumpFileName));
}

Expand Down Expand Up @@ -1758,7 +1757,7 @@ void CppCheck::analyseClangTidy(const FileSettings &fileSettings)
std::string line;

if (!mSettings.buildDir.empty()) {
const std::string analyzerInfoFile = AnalyzerInformation::getAnalyzerInfoFile(mSettings.buildDir, fileSettings.filename(), "", fileSettings.fileIndex);
const std::string analyzerInfoFile = AnalyzerInformation::getAnalyzerInfoFile(mSettings.buildDir, fileSettings.sfilename(), "", fileSettings.file.fsFileId());
std::ofstream fcmd(analyzerInfoFile + ".clang-tidy-cmd");
fcmd << istr.str();
}
Expand Down
8 changes: 4 additions & 4 deletions lib/cppcheck.h
Original file line number Diff line number Diff line change
Expand Up @@ -182,7 +182,7 @@ class CPPCHECKLIB CppCheck {
* @param cfgname cfg name
* @return number of errors found
*/
unsigned int checkFile(const FileWithDetails& file, const std::string &cfgname, int fileIndex);
unsigned int checkFile(const FileWithDetails& file, const std::string &cfgname);

void checkPlistOutput(const FileWithDetails& file, const std::vector<std::string>& files);

Expand All @@ -194,7 +194,7 @@ class CPPCHECKLIB CppCheck {
* @param size the size of the data to be read
* @return number of errors found
*/
unsigned int checkBuffer(const FileWithDetails& file, const std::string &cfgname, int fileIndex, const char* data, std::size_t size);
unsigned int checkBuffer(const FileWithDetails& file, const std::string &cfgname, const char* data, std::size_t size);

// TODO: should use simplecpp::OutputList
using CreateTokenListFn = std::function<simplecpp::TokenList (std::vector<std::string>&, std::list<simplecpp::Output>*)>;
Expand All @@ -206,7 +206,7 @@ class CPPCHECKLIB CppCheck {
* @param createTokenList a function to create the simplecpp::TokenList with
* @return number of errors found
*/
unsigned int checkInternal(const FileWithDetails& file, const std::string &cfgname, int fileIndex, const CreateTokenListFn& createTokenList);
unsigned int checkInternal(const FileWithDetails& file, const std::string &cfgname, const CreateTokenListFn& createTokenList);

/**
* @brief Check normal tokens
Expand Down Expand Up @@ -235,7 +235,7 @@ class CPPCHECKLIB CppCheck {
void executeRules(const std::string &tokenlist, const TokenList &list);
#endif

unsigned int checkClang(const FileWithDetails &file, int fileIndex);
unsigned int checkClang(const FileWithDetails &file);

const Settings& mSettings;
Suppressions& mSuppressions;
Expand Down
24 changes: 19 additions & 5 deletions lib/filesettings.h
Original file line number Diff line number Diff line change
Expand Up @@ -35,15 +35,20 @@ class FileWithDetails
{
public:
FileWithDetails(std::string path, Standards::Language lang, std::size_t size)
: mPath(std::move(path))
, mPathSimplified(Path::simplifyPath(mPath))
, mLang(lang)
: mLang(lang)
, mSize(size)
{
setPath(std::move(path));
if (mPath.empty())
throw std::runtime_error("empty path specified");
}

void setPath(std::string path)
{
mPath = std::move(path);
mPathSimplified = Path::simplifyPath(mPath);
}

const std::string& path() const
{
return mPath;
Expand All @@ -68,11 +73,22 @@ class FileWithDetails
{
return mLang;
}

std::size_t fsFileId() const
{
return mFsFileId;
}

void setFsFileId(std::size_t fsFileId)
{
mFsFileId = fsFileId;
}
private:
std::string mPath;
std::string mPathSimplified;
Standards::Language mLang = Standards::Language::None;
std::size_t mSize;
std::size_t mFsFileId{0};
};

/** File settings. Multiple configurations for a file is allowed. */
Expand All @@ -81,14 +97,12 @@ struct CPPCHECKLIB FileSettings {
: file(std::move(path), lang, size)
{}

int fileIndex = 0;
std::string cfg;
FileWithDetails file;
const std::string& filename() const
{
return file.path();
}
// cppcheck-suppress unusedFunction
const std::string& sfilename() const
{
return file.spath();
Expand Down
Loading
Loading