vaibhav.y added inline comments.

================
Comment at: clang/include/clang/Basic/Sarif.h:95
+//
+/// Since every in clang artifact MUST have a location (there being no nested
+/// artifacts), the creation method \ref SarifArtifact::create requires a
----------------
aaron.ballman wrote:
> How do we expect to handle artifact locations that don't correspond directly 
> to a file? For example, the user can specify macros on the command line and 
> those macros could have a diagnostic result associated with them. Can we 
> handle that sort of scenario?
I hadn't considered `-D` macros. Definitely a valid case to handle. I will 
respond with more information once I read through the related portions of the 
SARIF spec. A (sort of hacky?) solution come to mind after a quick glance:

Setting the artifact URI to: `data:text/plain:<CLI_ARG>` with an offset, and 
saying that it's role is `"referencedOnCommandLine"`. It seems strange since we 
need to copy over the command line, instead of referencing it directly. What do 
you think: 
https://docs.oasis-open.org/sarif/sarif/v2.1.0/os/sarif-v2.1.0-os.html#_Toc34317617

Dropping a TODO comment so I can update later.

`TODO(envp)`


================
Comment at: clang/include/clang/Basic/Sarif.h:109
+  SarifArtifactLocation Location;
+  SmallVector<StringRef> Roles;
+
----------------
aaron.ballman wrote:
> What size would you like this `SmallVector` to have?
Glancing through valid values for roles: my expectation is that each artifact 
will have a _small_ number of roles associated, so `4` seems like a good 
threshold here. I don't really have a strong opinion on the size, so I'm open 
to changing this.


================
Comment at: clang/include/clang/Basic/Sarif.h:250
+
+  SarifResult() = default;
+
----------------
aaron.ballman wrote:
> A default constructed `SarifResult` will have an uninitialized `RuleIdx` -- 
> are you okay with that?
Hrm, I had overlooked that case (since `appendResult` took and index and a 
rule). I'll make it take a rule index upon construction. This will also make it 
so that `appendResult` takes just the `SarifResult`, and not an (Idx, Result), 
which is definitely an artifact of before I added RuleIdx to `SarifResult`.



================
Comment at: clang/include/clang/Basic/Sarif.h:297-298
+  /// \internal
+  /// Return a pointer to the current tool. If no run exists, this will
+  /// crash.
+  json::Object *getCurrentTool();
----------------
aaron.ballman wrote:
> 
Thanks for rewording. I'll also make this return a reference, since the pointer 
returned cannot be null.


================
Comment at: clang/include/clang/Basic/Sarif.h:388-389
+private:
+  /// Langauge options to use for the current SARIF document
+  const LangOptions *LangOpts;
+
----------------
aaron.ballman wrote:
> I think this should be a value type rather than a possibly null pointer type 
> -- this way, the document can always rely on there being valid language 
> options to check, and if the user provides no custom language options, the 
> default `LangOptions` suffice. Alternatively, it seems reasonable to expect 
> the user to have to pass in a valid language options object in order to 
> create a SARIF document. WDYT?
I agree with that, will change it to store an owned value.

I think leaving the two constructors as is is fine as long as the `default` 
variant will also leave `LangOpts` in a valid state.


================
Comment at: clang/lib/Basic/Sarif.cpp:207-209
+    if (statusIter.second) {
+      I = statusIter.first;
+    }
----------------
aaron.ballman wrote:
> Our usual coding style elides these too. Btw, you can find the coding style 
> document at: https://llvm.org/docs/CodingStandards.html
Thanks, sorry there's so many of these! I definitely need to not auto-pilot 
with style.


================
Comment at: clang/lib/Basic/Sarif.cpp:219-222
+json::Object *SarifDocumentWriter::getCurrentTool() {
+  assert(hasRun() && "Need to call createRun() before using getcurrentTool!");
+  return Runs.back().getAsObject()->get("tool")->getAsObject();
+}
----------------
aaron.ballman wrote:
> Should this return a reference rather than a pointer?
Makes sense to convert to a ref, the pointer returned can never be null anyway


================
Comment at: clang/lib/Basic/Sarif.cpp:230-232
+  if (!hasRun()) {
+    return;
+  }
----------------
aaron.ballman wrote:
> Is there a reason why we don't want to assert instead?
Creating a document requires ending any ongoing runs, and it is valid to create 
a document without any runs, so `createDocument()` calls `endRun()`.

I guess having a flag to mark the status of the document, and only calling 
`endRun()` if a an active run exists would likely be better. (`hasRun()` seems 
to have a rather broad responsibility, tracking both the availability & state 
of the current run)

I'm thinking of adding a `Closed` flag to the writer (default `true`), which is 
unset whenever `createRun()` is called, and `endRun()` will set the same flag. 
That way we only `endRun()` if there is something to end, like so: 

1. Constructor makes writer with `Closed = true`
2. `createRun()` requires `Closed == true`, and sets it to `false`
3. `endRun()` requires `Closed == false`, and sets it to `true`
4. `createDocument()` requires `Closed == true`, and will call `endRun()` to 
ensure that

What do you think?


================
Comment at: clang/lib/Basic/Sarif.cpp:299
+  // Clear resources associated with a previous run
+  endRun();
+
----------------
aaron.ballman wrote:
> Is there a reason we don't want to assert that the caller has already ended a 
> run before they created a new one?
Calling `createDocument()` also calls `endRun()` (so as to provide a "complete" 
view of the document under construction).

So having `endRun()` amount to a no-op when there is no run because it is valid 
for `createDocument()` return a document with no runs associated with it. What 
do you think?


================
Comment at: clang/lib/Basic/Sarif.cpp:316
+
+json::Object *SarifDocumentWriter::currentRun() {
+  assert(hasRun() && "SARIF Document has no runs, create a run first!");
----------------
aaron.ballman wrote:
> Should this return a reference as well?
That is reasonable. Will have `currentTool()` and `currentRun()` return 
references.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D109701/new/

https://reviews.llvm.org/D109701

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to