Skip to content

Commit 84d128f

Browse files
committed
review
1 parent c1aad91 commit 84d128f

File tree

1 file changed

+47
-7
lines changed

1 file changed

+47
-7
lines changed

cli/cppcheckexecutor.cpp

Lines changed: 47 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -82,12 +82,32 @@ namespace {
8282
picojson::array ret;
8383
std::set<std::string> ruleIds;
8484
for (const auto& finding : mFindings) {
85+
// github only supports findings with locations
86+
if (finding.callStack.empty())
87+
continue;
8588
if (ruleIds.insert(finding.id).second) {
8689
picojson::object rule;
8790
rule["id"] = picojson::value(finding.id);
91+
// rule.shortDescription.text
8892
picojson::object shortDescription;
8993
shortDescription["text"] = picojson::value(finding.shortMessage());
9094
rule["shortDescription"] = picojson::value(shortDescription);
95+
// rule.fullDescription.text
96+
picojson::object fullDescription;
97+
fullDescription["text"] = picojson::value(finding.verboseMessage());
98+
rule["fullDescription"] = picojson::value(fullDescription);
99+
// rule.help.text
100+
picojson::object help;
101+
help["text"] = picojson::value(finding.verboseMessage()); // FIXME provide proper help text
102+
rule["help"] = picojson::value(help);
103+
// rule.properties.precision, rule.properties.problem.severity
104+
picojson::object properties;
105+
properties["precision"] = picojson::value(sarifPrecision(finding));
106+
picojson::object properties_problem;
107+
properties_problem["severity"] = picojson::value(sarifSeverity(finding));
108+
properties["problem"] = picojson::value(properties_problem);
109+
rule["properties"] = picojson::value(properties);
110+
91111
ret.emplace_back(rule);
92112
}
93113
}
@@ -104,6 +124,8 @@ namespace {
104124
picojson::object region;
105125
region["startLine"] = picojson::value(static_cast<int64_t>(location.line));
106126
region["startColumn"] = picojson::value(static_cast<int64_t>(location.column));
127+
region["endLine"] = region["startLine"];
128+
region["endColumn"] = region["startColumn"];
107129
physicalLocation["region"] = picojson::value(region);
108130
picojson::object loc;
109131
loc["physicalLocation"] = picojson::value(physicalLocation);
@@ -115,14 +137,20 @@ namespace {
115137
picojson::array serializeResults() const {
116138
picojson::array results;
117139
for (const auto& finding : mFindings) {
140+
// github only supports findings with locations
141+
if (finding.callStack.empty())
142+
continue;
118143
picojson::object res;
119-
res["level"] = picojson::value(sarifLevel(finding.severity));
120-
if (!finding.callStack.empty())
121-
res["locations"] = picojson::value(serializeLocations(finding));
144+
res["level"] = picojson::value(sarifSeverity(finding));
145+
res["locations"] = picojson::value(serializeLocations(finding));
122146
picojson::object message;
123147
message["text"] = picojson::value(finding.shortMessage());
124148
res["message"] = picojson::value(message);
125149
res["ruleId"] = picojson::value(finding.id);
150+
// partialFingerprints.hash
151+
picojson::object partialFingerprints;
152+
partialFingerprints["hash"] = picojson::value(getHash(finding));
153+
res["partialFingerprints"] = picojson::value(partialFingerprints);
126154
results.emplace_back(res);
127155
}
128156
return results;
@@ -159,11 +187,11 @@ namespace {
159187
}
160188
private:
161189

162-
163-
static std::string sarifLevel(Severity severity) {
164-
switch (severity) {
165-
case Severity::error:
190+
static std::string sarifSeverity(const ErrorMessage& errmsg) {
191+
if (ErrorLogger::isCriticalErrorId(errmsg.id))
166192
return "error";
193+
switch (errmsg.severity) {
194+
case Severity::error:
167195
case Severity::warning:
168196
case Severity::style:
169197
case Severity::portability:
@@ -178,7 +206,19 @@ namespace {
178206
return "note";
179207
}
180208

209+
static std::string sarifPrecision(const ErrorMessage& errmsg) {
210+
if (errmsg.certainty == Certainty::inconclusive)
211+
return "normal";
212+
return "high";
213+
}
181214

215+
std::string getHash(const ErrorMessage& errmsg) const {
216+
const std::string s = errmsg.toString(false, "{file}:{line}:{column}: {message} {id} {code}", "{file}:{line}:{column} {info} {code}");
217+
std::ostringstream os;
218+
//std::cout << s << std::endl;
219+
os << std::hex << std::hash<std::string> {}(s);
220+
return os.str();
221+
}
182222

183223
std::vector<ErrorMessage> mFindings;
184224
};

0 commit comments

Comments
 (0)