Skip to content

Commit a9952d9

Browse files
authored
CppCheck: avoid expensive std::ostringstream usage in checkFile() (#5481)
Scanning `common` from `xrdp` project with `DISABLE_VALUEFLOW=1` and `-D__GNUC__ --addon=misra`: Clang 16 `627,748,337` -> `541,852,912`
1 parent f037edf commit a9952d9

File tree

1 file changed

+33
-15
lines changed

1 file changed

+33
-15
lines changed

lib/cppcheck.cpp

Lines changed: 33 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -787,27 +787,46 @@ unsigned int CppCheck::checkFile(const std::string& filename, const std::string
787787
mPlistFile << ErrorLogger::plistHeader(version(), files);
788788
}
789789

790-
std::ostringstream dumpProlog;
790+
std::string dumpProlog;
791791
if (mSettings.dump || !mSettings.addons.empty()) {
792-
dumpProlog << " <rawtokens>" << std::endl;
793-
for (unsigned int i = 0; i < files.size(); ++i)
794-
dumpProlog << " <file index=\"" << i << "\" name=\"" << ErrorLogger::toxml(files[i]) << "\"/>" << std::endl;
792+
dumpProlog += " <rawtokens>\n";
793+
for (unsigned int i = 0; i < files.size(); ++i) {
794+
dumpProlog += " <file index=\"";
795+
dumpProlog += std::to_string(i);
796+
dumpProlog += "\" name=\"";
797+
dumpProlog += ErrorLogger::toxml(files[i]);
798+
dumpProlog += "\"/>\n";
799+
}
795800
for (const simplecpp::Token *tok = tokens1.cfront(); tok; tok = tok->next) {
796-
dumpProlog
797-
<< " <tok "
798-
<< "fileIndex=\"" << tok->location.fileIndex << "\" "
799-
<< "linenr=\"" << tok->location.line << "\" "
800-
<< "column=\"" << tok->location.col << "\" "
801-
<< "str=\"" << ErrorLogger::toxml(tok->str()) << "\""
802-
<< "/>" << std::endl;
801+
dumpProlog += " <tok ";
802+
803+
dumpProlog += "fileIndex=\"";
804+
dumpProlog += std::to_string(tok->location.fileIndex);
805+
dumpProlog += "\" ";
806+
807+
dumpProlog += "linenr=\"";
808+
dumpProlog += std::to_string(tok->location.line);
809+
dumpProlog += "\" ";
810+
811+
dumpProlog +="column=\"";
812+
dumpProlog += std::to_string(tok->location.col);
813+
dumpProlog += "\" ";
814+
815+
dumpProlog += "str=\"";
816+
dumpProlog += ErrorLogger::toxml(tok->str());
817+
dumpProlog += "\"";
818+
819+
dumpProlog += "/>\n";
803820
}
804-
dumpProlog << " </rawtokens>" << std::endl;
821+
dumpProlog += " </rawtokens>\n";
805822
}
806823

807824
// Parse comments and then remove them
808825
preprocessor.inlineSuppressions(tokens1, mSettings.nomsg);
809826
if (mSettings.dump || !mSettings.addons.empty()) {
810-
mSettings.nomsg.dump(dumpProlog);
827+
std::ostringstream oss;
828+
mSettings.nomsg.dump(oss);
829+
dumpProlog += oss.str();
811830
}
812831
tokens1.removeComments();
813832
preprocessor.removeComments();
@@ -841,8 +860,7 @@ unsigned int CppCheck::checkFile(const std::string& filename, const std::string
841860
std::string dumpFile;
842861
createDumpFile(mSettings, filename, fdump, dumpFile);
843862
if (fdump.is_open()) {
844-
fdump << dumpProlog.str();
845-
dumpProlog.str("");
863+
fdump << dumpProlog;
846864
if (!mSettings.dump)
847865
filesDeleter.addFile(dumpFile);
848866
}

0 commit comments

Comments
 (0)