@@ -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