@@ -139,7 +139,7 @@ static std::string getDumpFileName(const Settings& settings, const std::string&
139139 return settings.dumpFile ;
140140
141141 std::string extension;
142- if (settings.dump )
142+ if (settings.dump || !settings. buildDir . empty () )
143143 extension = " .dump" ;
144144 else
145145 extension = " ." + std::to_string (settings.pid ) + " .dump" ;
@@ -167,7 +167,7 @@ static void createDumpFile(const Settings& settings,
167167 if (!fdump.is_open ())
168168 return ;
169169
170- {
170+ if (!settings. buildDir . empty ()) {
171171 std::ofstream fout (getCtuInfoFileName (dumpFile));
172172 }
173173
@@ -1419,8 +1419,7 @@ void CppCheck::executeAddons(const std::vector<std::string>& files, const std::s
14191419 std::string fileList;
14201420
14211421 if (files.size () >= 2 || endsWith (files[0 ], " .ctu-info" )) {
1422- fileList = Path::getPathFromFilename (files[0 ]) + FILELIST + std::to_string (mSettings .pid );
1423- filesDeleter.addFile (fileList);
1422+ fileList = Path::getPathFromFilename (files[0 ]) + FILELIST;
14241423 std::ofstream fout (fileList);
14251424 for (const std::string& f: files)
14261425 fout << f << std::endl;
@@ -1429,6 +1428,8 @@ void CppCheck::executeAddons(const std::vector<std::string>& files, const std::s
14291428 // ensure all addons have already been resolved - TODO: remove when settings are const after creation
14301429 assert (mSettings .addonInfos .size () == mSettings .addons .size ());
14311430
1431+ std::string ctuInfo;
1432+
14321433 for (const AddonInfo &addonInfo : mSettings .addonInfos ) {
14331434 if (addonInfo.name != " misra" && !addonInfo.ctu && endsWith (files.back (), " .ctu-info" ))
14341435 continue ;
@@ -1445,6 +1446,18 @@ void CppCheck::executeAddons(const std::vector<std::string>& files, const std::s
14451446
14461447 ErrorMessage errmsg;
14471448
1449+ if (obj.count (" summary" ) > 0 ) {
1450+ if (!mSettings .buildDir .empty ()) {
1451+ ctuInfo += res.serialize () + " \n " ;
1452+ } else {
1453+ errmsg.severity = Severity::internal;
1454+ errmsg.id = " ctuinfo" ;
1455+ errmsg.setmsg (res.serialize ());
1456+ reportErr (errmsg);
1457+ }
1458+ continue ;
1459+ }
1460+
14481461 if (obj.count (" file" ) > 0 ) {
14491462 std::string fileName = obj[" file" ].get <std::string>();
14501463 const int64_t lineNumber = obj[" linenr" ].get <int64_t >();
@@ -1483,13 +1496,30 @@ void CppCheck::executeAddons(const std::vector<std::string>& files, const std::s
14831496 reportErr (errmsg);
14841497 }
14851498 }
1499+
1500+ if (!mSettings .buildDir .empty () && fileList.empty ()) {
1501+ const std::string& ctuInfoFile = getCtuInfoFileName (files[0 ]);
1502+ std::ofstream fout (ctuInfoFile);
1503+ fout << ctuInfo;
1504+ }
14861505}
14871506
1488- void CppCheck::executeAddonsWholeProgram (const std::list<FileWithDetails> &files, const std::list<FileSettings>& fileSettings)
1507+ void CppCheck::executeAddonsWholeProgram (const std::list<FileWithDetails> &files, const std::list<FileSettings>& fileSettings, const std::string& ctuInfo )
14891508{
14901509 if (mSettings .addons .empty ())
14911510 return ;
14921511
1512+ if (mSettings .buildDir .empty ()) {
1513+ const std::string fileName = std::to_string (mSettings .pid ) + " .ctu-info" ;
1514+ FilesDeleter filesDeleter;
1515+ filesDeleter.addFile (fileName);
1516+ std::ofstream fout (fileName);
1517+ fout << ctuInfo;
1518+ fout.close ();
1519+ executeAddons ({fileName}, " " );
1520+ return ;
1521+ }
1522+
14931523 std::vector<std::string> ctuInfoFiles;
14941524 for (const auto &f: files) {
14951525 const std::string &dumpFileName = getDumpFileName (mSettings , f.path ());
@@ -1507,11 +1537,6 @@ void CppCheck::executeAddonsWholeProgram(const std::list<FileWithDetails> &files
15071537 const ErrorMessage errmsg = ErrorMessage::fromInternalError (e, nullptr , " " , " Bailing out from analysis: Whole program analysis failed" );
15081538 reportErr (errmsg);
15091539 }
1510-
1511- if (mSettings .buildDir .empty ()) {
1512- for (const std::string &f: ctuInfoFiles)
1513- std::remove (f.c_str ());
1514- }
15151540}
15161541
15171542Settings &CppCheck::settings ()
@@ -1807,13 +1832,9 @@ bool CppCheck::analyseWholeProgram()
18071832 return errors && (mExitCode > 0 );
18081833}
18091834
1810- unsigned int CppCheck::analyseWholeProgram (const std::string &buildDir, const std::list<FileWithDetails> &files, const std::list<FileSettings>& fileSettings)
1835+ unsigned int CppCheck::analyseWholeProgram (const std::string &buildDir, const std::list<FileWithDetails> &files, const std::list<FileSettings>& fileSettings, const std::string& ctuInfo )
18111836{
1812- executeAddonsWholeProgram (files, fileSettings);
1813- if (buildDir.empty ()) {
1814- removeCtuInfoFiles (files, fileSettings);
1815- return mExitCode ;
1816- }
1837+ executeAddonsWholeProgram (files, fileSettings, ctuInfo);
18171838 if (mSettings .checks .isEnabled (Checks::unusedFunction))
18181839 CheckUnusedFunctions::analyseWholeProgram (mSettings , *this , buildDir);
18191840 std::list<Check::FileInfo*> fileInfoList;
@@ -1877,22 +1898,6 @@ unsigned int CppCheck::analyseWholeProgram(const std::string &buildDir, const st
18771898 return mExitCode ;
18781899}
18791900
1880- void CppCheck::removeCtuInfoFiles (const std::list<FileWithDetails> &files, const std::list<FileSettings>& fileSettings)
1881- {
1882- if (mSettings .buildDir .empty ()) {
1883- for (const auto & f: files) {
1884- const std::string &dumpFileName = getDumpFileName (mSettings , f.path ());
1885- const std::string &ctuInfoFileName = getCtuInfoFileName (dumpFileName);
1886- std::remove (ctuInfoFileName.c_str ());
1887- }
1888- for (const auto & fs: fileSettings) {
1889- const std::string &dumpFileName = getDumpFileName (mSettings , fs.filename ());
1890- const std::string &ctuInfoFileName = getCtuInfoFileName (dumpFileName);
1891- std::remove (ctuInfoFileName.c_str ());
1892- }
1893- }
1894- }
1895-
18961901// cppcheck-suppress unusedFunction - only used in tests
18971902void CppCheck::resetTimerResults ()
18981903{
0 commit comments