On Tue, 2023-11-07 at 08:04 +0100, Simon Sobisch wrote: > Thank you very much for this proof-of-concept use! > > Inspecting it raises the following questions to me, both for a > possible > binutils implementation and for the library use in general: > > * How should the application set the relevant context (often lines > are > shown before/after)?
Currently the source-printing code has this logic (in gcc/diagnostic- show-locus.cc): - filter locations within the diagnostic to "sufficiently sane" ones (thus ignoring e.g. ranges that end before they start) - look at all of the remaining locations that are in the same source file as the primary location of the diagnostic - determine a set of runs of source lines; layout::calculate_line_spans has this comment: /* We want to print the pertinent source code at a diagnostic. The rich_location can contain multiple locations. This will have been filtered into m_exploc (the caret for the primary location) and m_layout_ranges, for those ranges within the same source file. We will print a subset of the lines within the source file in question, as a collection of "spans" of lines. This function populates m_line_spans with an ordered, disjoint list of the line spans of interest. Printing a gap between line spans takes one line, so, when printing line numbers, we allow a gap of up to one line between spans when merging, since it makes more sense to print the source line rather than a "gap-in-line-numbering" line. When not printing line numbers, it's better to be more explicit about what's going on, so keeping them as separate spans is preferred. For example, if the primary range is on lines 8-10, with secondary ranges covering lines 5-6 and lines 13-15: 004 005 |RANGE 1 006 |RANGE 1 007 008 |PRIMARY RANGE 009 |PRIMARY CARET 010 |PRIMARY RANGE 011 012 013 |RANGE 2 014 |RANGE 2 015 |RANGE 2 016 With line numbering on, we want two spans: lines 5-10 and lines 13-15. With line numbering off (with span headers), we want three spans: lines 5-6, lines 8-10, and lines 13-15. */ (end of quote) This algorithm could be tweaked if you want extra lines of context, perhaps having an integer option N for N extra lines of before/after context around each run. > * Should it be possible to override msgid used to display the > warning/error type? > If this would be possible then the text sink in messages_init may > be > adjusted to replace the label with _("Warning") and _("Error"), > which > would leave the text output "as-is" (if the text sink is > configured to > not output the source line); this would make it usable without > adjusting the testsuite and to adopt to a standard later. For the msgids, I was more thinking of the messages of the diagnostics themselves; for instance, in GCC the error format string: "Invalid argument %d for builtin %qF" has fr.po translation: "Argument %d invalide pour la fonction interne %qF" But it sounds like gas also has capitalized severities (e.g. "Warning"), so maybe that should simply be a flag in the text sink. > > > Notes for the SARIF output: > * the region contains an error, according to the linked JSON spec > startColumn has a minimum of 1 (I guess you'd just leave it away > if > the application did not set it) Good catch; looks like a bug in my SARIF output code. I've filed it for myself as: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=112425 > * the application should have the option to pre-set the > sourceLanguage > for the diagnostic_manager (maybe even make that a positional > argument > that needs to be passed but can be NULL) and override it when > specifying a region Why? Note that the sourceLanguage can always be NULL. I considered setting it for gas, but it's not clear what the value can be, so I just omit it; see: https://github.com/oasis-tcs/sarif-spec/issues/608 [..snip...] Thanks for the feedback Dave