diff --git a/gcc/libsarifreplay.cc b/gcc/libsarifreplay.cc index cc051dcd485c49692f2418a1f8da9938b2b89b0a..ce42bdace3ca3a6e380133386d210860a9586c18 100644 --- a/gcc/libsarifreplay.cc +++ b/gcc/libsarifreplay.cc @@ -272,12 +272,14 @@ private: const char * lookup_plain_text_within_result_message (const json::object *tool_component_obj, const json::object &message_obj, - const json::object *rule_obj); + const json::object *rule_obj, + const json::string *&out_js_str); // "multiformatMessageString" object (§3.12). const char * get_plain_text_from_mfms (json::value &mfms_val, - const property_spec_ref &prop); + const property_spec_ref &prop, + const json::string *&out_js_str); // "run" object (§3.14) enum status @@ -1367,13 +1369,17 @@ make_plain_text_within_result_message (const json::object *tool_component_obj, const json::object &message_obj, const json::object *rule_obj) { + const json::string *js_str = nullptr; const char *original_text = lookup_plain_text_within_result_message (tool_component_obj, message_obj, - rule_obj); + rule_obj, + js_str); if (!original_text) return label_text::borrow (nullptr); + gcc_assert (js_str); + /* Look up any arguments for substituting into placeholders. */ const property_spec_ref arguments_prop ("message", "arguments", "3.11.11"); const json::array *arguments @@ -1425,7 +1431,9 @@ make_plain_text_within_result_message (const json::object *tool_component_obj, } else { - report_invalid_sarif (message_obj, arguments_prop, + const spec_ref msgs_with_placeholders ("3.11.5"); + gcc_assert (js_str); + report_invalid_sarif (*js_str, msgs_with_placeholders, "unescaped '%c' within message string", ch); return label_text::borrow (nullptr); @@ -1450,11 +1458,14 @@ make_plain_text_within_result_message (const json::object *tool_component_obj, /* Handle a value that should be a multiformatMessageString object (§3.12). Complain using prop if MFMS_VAL is not an object. - Return get the "text" value (or nullptr, and complain). */ + Return get the "text" value (or nullptr, and complain). + If the result is non-null, write the json::string that was actually used + to OUT_JS_STR. */ const char * sarif_replayer::get_plain_text_from_mfms (json::value &mfms_val, - const property_spec_ref &prop) + const property_spec_ref &prop, + const json::string *&out_js_str) { auto mfms_obj = require_object (mfms_val, prop); if (!mfms_obj) @@ -1465,6 +1476,7 @@ sarif_replayer::get_plain_text_from_mfms (json::value &mfms_val, auto text_jstr = get_required_property<json::string> (*mfms_obj, text_prop); if (!text_jstr) return nullptr; + out_js_str = text_jstr; return text_jstr->get_string (); } @@ -1479,13 +1491,17 @@ sarif_replayer::get_plain_text_from_mfms (json::value &mfms_val, is the value of result.message (§3.27.11). MESSAGE_OBJ is "theMessage" - RULE_OBJ is "theRule". */ + RULE_OBJ is "theRule". + + If the result is non-null, write the json::string that was actually used + to OUT_JS_STR. */ const char * sarif_replayer:: lookup_plain_text_within_result_message (const json::object *tool_component_obj, const json::object &message_obj, - const json::object *rule_obj) + const json::object *rule_obj, + const json::string *&out_js_str) { // rule_obj can be NULL @@ -1493,8 +1509,11 @@ lookup_plain_text_within_result_message (const json::object *tool_component_obj, Use the text or markdown property of theMessage as appropriate. */ if (const json::string *str = get_optional_property<json::string> (message_obj, PROP_message_text)) - // TODO: check language - return str->get_string (); + { + // TODO: check language + out_js_str = str; + return str->get_string (); + } if (rule_obj) if (auto message_id_jstr @@ -1507,7 +1526,7 @@ lookup_plain_text_within_result_message (const json::object *tool_component_obj, = get_optional_property<json::object> (*rule_obj, message_strings)) if (json::value *mfms = message_strings_obj->get (message_id)) - return get_plain_text_from_mfms (*mfms, message_strings); + return get_plain_text_from_mfms (*mfms, message_strings, out_js_str); /* Look up by theMessage.id within theComponent.globalMessageStrings (§3.19.22). */ @@ -1519,7 +1538,7 @@ lookup_plain_text_within_result_message (const json::object *tool_component_obj, = get_optional_property<json::object> (*tool_component_obj, prop_gms)) if (auto mfms = global_message_strings->get (message_id)) - return get_plain_text_from_mfms (*mfms, prop_gms); + return get_plain_text_from_mfms (*mfms, prop_gms, out_js_str); } } diff --git a/gcc/testsuite/sarif-replay.dg/2.1.0-invalid/3.11.11-malformed-placeholder.sarif b/gcc/testsuite/sarif-replay.dg/2.1.0-invalid/3.11.5-unescaped-braces.sarif similarity index 84% rename from gcc/testsuite/sarif-replay.dg/2.1.0-invalid/3.11.11-malformed-placeholder.sarif rename to gcc/testsuite/sarif-replay.dg/2.1.0-invalid/3.11.5-unescaped-braces.sarif index 72da185de0dc35a648ca5bc6e8365284ea1c89dc..29460e19c6983d9e44ceb7f5d602cb7788507c42 100644 --- a/gcc/testsuite/sarif-replay.dg/2.1.0-invalid/3.11.11-malformed-placeholder.sarif +++ b/gcc/testsuite/sarif-replay.dg/2.1.0-invalid/3.11.5-unescaped-braces.sarif @@ -3,7 +3,7 @@ "runs": [{ "tool": { "driver": { "name": "example" } }, "results": [ - { "message": { "text" : "before {} after" }, /* { dg-error "unescaped '\\\{' within message string \\\[SARIF v2.1.0 §3.11.11\\\]" } */ + { "message": { "text" : "before {} after" }, /* { dg-error "unescaped '\\\{' within message string \\\[SARIF v2.1.0 §3.11.5\\\]" } */ "locations": [] } ] }] @@ -11,5 +11,5 @@ /* { dg-begin-multiline-output "" } 6 | { "message": { "text" : "before {} after" }, - | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + | ^~~~~~~~~~~~~~~~~ { dg-end-multiline-output "" } */