Skip to content

Commit d976b35

Browse files
committed
Fix #14009 (github upload errors)
1 parent 8f3d36a commit d976b35

8 files changed

Lines changed: 284 additions & 155 deletions

File tree

Makefile

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,7 @@ ifndef INCLUDE_FOR_CLI
171171
endif
172172

173173
ifndef INCLUDE_FOR_TEST
174-
INCLUDE_FOR_TEST=-Ilib -Ifrontend -Icli -isystem externals/simplecpp -isystem externals/tinyxml2
174+
INCLUDE_FOR_TEST=-Ilib -Ifrontend -Icli -isystem externals/picojson -isystem externals/simplecpp -isystem externals/tinyxml2
175175
endif
176176

177177
BIN=$(DESTDIR)$(PREFIX)/bin
@@ -264,6 +264,7 @@ CLIOBJ = cli/cmdlineparser.o \
264264
cli/filelister.o \
265265
cli/main.o \
266266
cli/processexecutor.o \
267+
cli/sarifreport.o \
267268
cli/sehwrapper.o \
268269
cli/signalhandler.o \
269270
cli/singleexecutor.o \
@@ -316,6 +317,7 @@ TESTOBJ = test/fixture.o \
316317
test/testpreprocessor.o \
317318
test/testprocessexecutor.o \
318319
test/testprogrammemory.o \
320+
test/testsarifreport.o \
319321
test/testsettings.o \
320322
test/testsimplifytemplate.o \
321323
test/testsimplifytokens.o \
@@ -356,7 +358,7 @@ cppcheck: $(EXTOBJ) $(LIBOBJ) $(FEOBJ) $(CLIOBJ)
356358

357359
all: cppcheck testrunner
358360

359-
testrunner: $(EXTOBJ) $(TESTOBJ) $(LIBOBJ) $(FEOBJ) cli/cmdlineparser.o cli/cppcheckexecutor.o cli/executor.o cli/filelister.o cli/processexecutor.o cli/sehwrapper.o cli/signalhandler.o cli/singleexecutor.o cli/stacktrace.o cli/threadexecutor.o
361+
testrunner: $(EXTOBJ) $(TESTOBJ) $(LIBOBJ) $(FEOBJ) cli/cmdlineparser.o cli/cppcheckexecutor.o cli/executor.o cli/filelister.o cli/processexecutor.o cli/sarifreport.o cli/sehwrapper.o cli/signalhandler.o cli/singleexecutor.o cli/stacktrace.o cli/threadexecutor.o
360362
$(CXX) $(CPPFLAGS) $(CXXFLAGS) -o $@ $^ $(LIBS) $(LDFLAGS) $(RDYNAMIC)
361363

362364
test: all
@@ -666,7 +668,7 @@ frontend/frontend.o: frontend/frontend.cpp frontend/frontend.h lib/addoninfo.h l
666668
cli/cmdlineparser.o: cli/cmdlineparser.cpp cli/cmdlinelogger.h cli/cmdlineparser.h cli/filelister.h externals/tinyxml2/tinyxml2.h lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/cppcheck.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/importproject.h lib/library.h lib/mathlib.h lib/path.h lib/pathmatch.h lib/platform.h lib/settings.h lib/standards.h lib/suppressions.h lib/timer.h lib/utils.h lib/xml.h
667669
$(CXX) ${INCLUDE_FOR_CLI} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ cli/cmdlineparser.cpp
668670

669-
cli/cppcheckexecutor.o: cli/cppcheckexecutor.cpp cli/cmdlinelogger.h cli/cmdlineparser.h cli/cppcheckexecutor.h cli/executor.h cli/processexecutor.h cli/sehwrapper.h cli/signalhandler.h cli/singleexecutor.h cli/threadexecutor.h externals/picojson/picojson.h lib/addoninfo.h lib/analyzerinfo.h lib/check.h lib/checkers.h lib/checkersreport.h lib/color.h lib/config.h lib/cppcheck.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/json.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/suppressions.h lib/utils.h
671+
cli/cppcheckexecutor.o: cli/cppcheckexecutor.cpp cli/cmdlinelogger.h cli/cmdlineparser.h cli/cppcheckexecutor.h cli/executor.h cli/processexecutor.h cli/sarifreport.h cli/sehwrapper.h cli/signalhandler.h cli/singleexecutor.h cli/threadexecutor.h externals/picojson/picojson.h lib/addoninfo.h lib/analyzerinfo.h lib/check.h lib/checkers.h lib/checkersreport.h lib/color.h lib/config.h lib/cppcheck.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/json.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/suppressions.h lib/utils.h
670672
$(CXX) ${INCLUDE_FOR_CLI} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ cli/cppcheckexecutor.cpp
671673

672674
cli/executor.o: cli/executor.cpp cli/executor.h lib/addoninfo.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/standards.h lib/suppressions.h lib/utils.h
@@ -681,6 +683,9 @@ cli/main.o: cli/main.cpp cli/cppcheckexecutor.h lib/config.h lib/errortypes.h li
681683
cli/processexecutor.o: cli/processexecutor.cpp cli/executor.h cli/processexecutor.h lib/addoninfo.h lib/check.h lib/checkers.h lib/config.h lib/cppcheck.h lib/errorlogger.h lib/errortypes.h lib/filesettings.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/suppressions.h lib/timer.h lib/utils.h
682684
$(CXX) ${INCLUDE_FOR_CLI} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ cli/processexecutor.cpp
683685

686+
cli/sarifreport.o: cli/sarifreport.cpp cli/sarifreport.h externals/picojson/picojson.h lib/addoninfo.h lib/check.h lib/checkers.h lib/config.h lib/cppcheck.h lib/errorlogger.h lib/errortypes.h lib/json.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/standards.h lib/utils.h
687+
$(CXX) ${INCLUDE_FOR_CLI} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ cli/sarifreport.cpp
688+
684689
cli/sehwrapper.o: cli/sehwrapper.cpp cli/sehwrapper.h lib/config.h lib/utils.h
685690
$(CXX) ${INCLUDE_FOR_CLI} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ cli/sehwrapper.cpp
686691

@@ -834,6 +839,9 @@ test/testprocessexecutor.o: test/testprocessexecutor.cpp cli/executor.h cli/proc
834839
test/testprogrammemory.o: test/testprogrammemory.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/programmemory.h lib/settings.h lib/standards.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h
835840
$(CXX) ${INCLUDE_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testprogrammemory.cpp
836841

842+
test/testsarifreport.o: test/testsarifreport.cpp cli/sarifreport.h externals/picojson/picojson.h lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/json.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/standards.h lib/utils.h test/fixture.h
843+
$(CXX) ${INCLUDE_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testsarifreport.cpp
844+
837845
test/testsettings.o: test/testsettings.cpp lib/addoninfo.h lib/check.h lib/checkers.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/suppressions.h lib/tokenize.h lib/tokenlist.h lib/utils.h test/fixture.h test/helpers.h
838846
$(CXX) ${INCLUDE_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testsettings.cpp
839847

cli/cli.vcxproj

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,7 @@
226226
<ClInclude Include="executor.h" />
227227
<ClInclude Include="filelister.h" />
228228
<ClInclude Include="processexecutor.h" />
229+
<ClInclude Include="sarifreport.h" />
229230
<ClInclude Include="sehwrapper.h" />
230231
<ClInclude Include="signalhandler.h" />
231232
<ClInclude Include="singleexecutor.h" />
@@ -250,6 +251,7 @@
250251
<ClCompile Include="filelister.cpp" />
251252
<ClCompile Include="main.cpp" />
252253
<ClCompile Include="processexecutor.cpp" />
254+
<ClCompile Include="sarifreport.cpp" />
253255
<ClCompile Include="sehwrapper.cpp" />
254256
<ClCompile Include="signalhandler.cpp" />
255257
<ClCompile Include="singleexecutor.cpp" />

cli/cppcheckexecutor.cpp

Lines changed: 1 addition & 151 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232
#include "errorlogger.h"
3333
#include "errortypes.h"
3434
#include "filesettings.h"
35-
#include "json.h"
35+
#include "sarifreport.h"
3636
#include "settings.h"
3737
#include "singleexecutor.h"
3838
#include "suppressions.h"
@@ -78,156 +78,6 @@
7878
#endif
7979

8080
namespace {
81-
class SarifReport {
82-
public:
83-
void addFinding(ErrorMessage msg) {
84-
mFindings.push_back(std::move(msg));
85-
}
86-
87-
picojson::array serializeRules() const {
88-
picojson::array ret;
89-
std::set<std::string> ruleIds;
90-
for (const auto& finding : mFindings) {
91-
// github only supports findings with locations
92-
if (finding.callStack.empty())
93-
continue;
94-
if (ruleIds.insert(finding.id).second) {
95-
picojson::object rule;
96-
rule["id"] = picojson::value(finding.id);
97-
// rule.shortDescription.text
98-
picojson::object shortDescription;
99-
shortDescription["text"] = picojson::value(finding.shortMessage());
100-
rule["shortDescription"] = picojson::value(shortDescription);
101-
// rule.fullDescription.text
102-
picojson::object fullDescription;
103-
fullDescription["text"] = picojson::value(finding.verboseMessage());
104-
rule["fullDescription"] = picojson::value(fullDescription);
105-
// rule.help.text
106-
picojson::object help;
107-
help["text"] = picojson::value(finding.verboseMessage()); // FIXME provide proper help text
108-
rule["help"] = picojson::value(help);
109-
// rule.properties.precision, rule.properties.problem.severity
110-
picojson::object properties;
111-
properties["precision"] = picojson::value(sarifPrecision(finding));
112-
double securitySeverity = 0;
113-
if (finding.severity == Severity::error && !ErrorLogger::isCriticalErrorId(finding.id))
114-
securitySeverity = 9.9; // We see undefined behavior
115-
//else if (finding.severity == Severity::warning)
116-
// securitySeverity = 5.1; // We see potential undefined behavior
117-
if (securitySeverity > 0.5) {
118-
properties["security-severity"] = picojson::value(securitySeverity);
119-
const picojson::array tags{picojson::value("security")};
120-
properties["tags"] = picojson::value(tags);
121-
}
122-
rule["properties"] = picojson::value(properties);
123-
// rule.defaultConfiguration.level
124-
picojson::object defaultConfiguration;
125-
defaultConfiguration["level"] = picojson::value(sarifSeverity(finding));
126-
rule["defaultConfiguration"] = picojson::value(defaultConfiguration);
127-
128-
ret.emplace_back(rule);
129-
}
130-
}
131-
return ret;
132-
}
133-
134-
static picojson::array serializeLocations(const ErrorMessage& finding) {
135-
picojson::array ret;
136-
for (const auto& location : finding.callStack) {
137-
picojson::object physicalLocation;
138-
picojson::object artifactLocation;
139-
artifactLocation["uri"] = picojson::value(location.getfile(false));
140-
physicalLocation["artifactLocation"] = picojson::value(artifactLocation);
141-
picojson::object region;
142-
region["startLine"] = picojson::value(static_cast<int64_t>(location.line));
143-
region["startColumn"] = picojson::value(static_cast<int64_t>(location.column));
144-
region["endLine"] = region["startLine"];
145-
region["endColumn"] = region["startColumn"];
146-
physicalLocation["region"] = picojson::value(region);
147-
picojson::object loc;
148-
loc["physicalLocation"] = picojson::value(physicalLocation);
149-
ret.emplace_back(loc);
150-
}
151-
return ret;
152-
}
153-
154-
picojson::array serializeResults() const {
155-
picojson::array results;
156-
for (const auto& finding : mFindings) {
157-
// github only supports findings with locations
158-
if (finding.callStack.empty())
159-
continue;
160-
picojson::object res;
161-
res["level"] = picojson::value(sarifSeverity(finding));
162-
res["locations"] = picojson::value(serializeLocations(finding));
163-
picojson::object message;
164-
message["text"] = picojson::value(finding.shortMessage());
165-
res["message"] = picojson::value(message);
166-
res["ruleId"] = picojson::value(finding.id);
167-
results.emplace_back(res);
168-
}
169-
return results;
170-
}
171-
172-
picojson::value serializeRuns(const std::string& productName, const std::string& version) const {
173-
picojson::object driver;
174-
driver["name"] = picojson::value(productName);
175-
driver["semanticVersion"] = picojson::value(version);
176-
driver["informationUri"] = picojson::value("https://cppcheck.sourceforge.io");
177-
driver["rules"] = picojson::value(serializeRules());
178-
picojson::object tool;
179-
tool["driver"] = picojson::value(driver);
180-
picojson::object run;
181-
run["tool"] = picojson::value(tool);
182-
run["results"] = picojson::value(serializeResults());
183-
picojson::array runs{picojson::value(run)};
184-
return picojson::value(runs);
185-
}
186-
187-
std::string serialize(std::string productName) const {
188-
const auto nameAndVersion = Settings::getNameAndVersion(productName);
189-
productName = nameAndVersion.first.empty() ? "Cppcheck" : nameAndVersion.first;
190-
std::string version = nameAndVersion.first.empty() ? CppCheck::version() : nameAndVersion.second;
191-
if (version.find(' ') != std::string::npos)
192-
version.erase(version.find(' '), std::string::npos);
193-
194-
picojson::object doc;
195-
doc["version"] = picojson::value("2.1.0");
196-
doc["$schema"] = picojson::value("https://docs.oasis-open.org/sarif/sarif/v2.1.0/errata01/os/schemas/sarif-schema-2.1.0.json");
197-
doc["runs"] = serializeRuns(productName, version);
198-
199-
return picojson::value(doc).serialize(true);
200-
}
201-
private:
202-
203-
static std::string sarifSeverity(const ErrorMessage& errmsg) {
204-
if (ErrorLogger::isCriticalErrorId(errmsg.id))
205-
return "error";
206-
switch (errmsg.severity) {
207-
case Severity::error:
208-
case Severity::warning:
209-
case Severity::style:
210-
case Severity::portability:
211-
case Severity::performance:
212-
return "warning";
213-
case Severity::information:
214-
case Severity::internal:
215-
case Severity::debug:
216-
case Severity::none:
217-
return "note";
218-
}
219-
return "note";
220-
}
221-
222-
static std::string sarifPrecision(const ErrorMessage& errmsg) {
223-
if (errmsg.certainty == Certainty::inconclusive)
224-
return "medium";
225-
return "high";
226-
}
227-
228-
std::vector<ErrorMessage> mFindings;
229-
};
230-
23181
class CmdLineLoggerStd : public CmdLineLogger
23282
{
23383
public:

0 commit comments

Comments
 (0)