NoQ added inline comments.

================
Comment at: clang/lib/StaticAnalyzer/Checkers/BitwiseShiftChecker.cpp:301-302
+                      pluralSuffix(MaximalAllowedShift));
+    R->addNote(LeftNote, PathDiagnosticLocation{LHS, Ctx.getSourceManager(),
+                                                Ctx.getLocationContext()});
+    Ctx.emitReport(std::move(R));
----------------
donat.nagy wrote:
> donat.nagy wrote:
> > donat.nagy wrote:
> > > gamesh411 wrote:
> > > > donat.nagy wrote:
> > > > > NoQ wrote:
> > > > > > Can we just append this to the warning? The `addNote()` is useful 
> > > > > > for notes that need to be placed in code outside of the execution 
> > > > > > path, but if it's always next to the warning, it probably doesn't 
> > > > > > make sense to display it separately.
> > > > > I didn't append this to the warning because I felt that the warning 
> > > > > text is already too long. (By the way, an earlier internal variant of 
> > > > > this checker produced two separate notes next to the warning message.)
> > > > > 
> > > > > I tweaked the messages of this checker before initiating this review, 
> > > > > but I feel that there's still some room for improvements. (E.g. in 
> > > > > this particular case perhaps we could omit some of the details that 
> > > > > are not immediately useful and could be manually calculated from 
> > > > > other parts of the message...) 
> > > > Just a thought on simplifying the diagnostics a bit:
> > > > 
> > > > Warning: "Right operand is negative in left shift"
> > > > Note: "The result of left shift is undefined because the right operand 
> > > > is negative"
> > > > Shortened: "Undefined left shift due to negative right operand"
> > > > 
> > > > Warning: "Left shift by '34' overflows the capacity of 'int'"
> > > > Note: "The result of left shift is undefined because the right operand 
> > > > '34' is not smaller than 32, the capacity of 'int'"
> > > > Shortened: "Undefined left shift: '34' exceeds 'int' capacity (32 bits)"
> > > > 
> > > > The more complex notes are a bit sketchy, as relevant information can 
> > > > be lost, and the following solution is probably a bit too much, but 
> > > > could prove to be an inspiration:
> > > > 
> > > > Warning: "Left shift of '1024' overflows the capacity of 'int'"
> > > > CXX Note: "Left shift of '1024' is undefined because 'int' can hold 
> > > > only 32 bits (including the sign bit), so some bits overflow"
> > > > CXX Note: "The value '1024' is represented by 11 bits, allowing at most 
> > > > 21 bits for bitshift"
> > > > C Note: "Left shift of '1024' is undefined because 'int' can hold only 
> > > > 31 bits (excluding the sign bit), so some bits overflow"
> > > > C Note: "The value '1024' is represented by 11 bits, allowing at most 
> > > > 20 bits for bitshift"
> > > > 
> > > > Shortened:
> > > > CXX Warning: "Undefined left shift: '1024' (11 bits) exceeds 'int' 
> > > > capacity (32 bits, including sign)"
> > > > C Warning: "Undefined left shift: '1024' (11 bits) exceeds 'int' 
> > > > capacity (31 bits, excluding sign)"
> > > Clarification about the `Msg`/`ShortMsg` distinction:
> > > I'm intentionally separating the short warning messages and the longer 
> > > note messages because `createBugReport()` enforces the convention that it 
> > > will always emit a warning and a note at the bug location.
> > > 
> > > According to the comments in the source code, the intention is that the 
> > > note contains all the relevant information, while the warning is a brief 
> > > summary that can be displayed in situations where the notes wouldn't fit 
> > > the UI.
> > > 
> > > IIUC many checkers ignore this distinction and emit the same (often long 
> > > and cumbersome) message both as a note and as a warning 
> > > (`createBugReport()` has a variant which takes only one message parameter 
> > > and passes it to both locations), but I tried to follow it because I 
> > > think it's ugly when the same message is repeated twice and there is some 
> > > sense in providing both a brief summary and a full description that 
> > > doesn't use potentially-ambiguous abbreviations to save space.
> > > 
> > > Of course I could also accept a community decision that this "brief 
> > > warning / full note" distinction is deprecated and will be eliminated 
> > > (because e.g. front-end utilities are not prepared to handle it), but in 
> > > that case I'd strongly suggest a redesign where we eliminate the 
> > > redundantly printed 'note' message. (There is no reason to say the same 
> > > thing twice! There is no reason to say the same thing twice!)
> > > 
> > > On the other hand, in addition to this `Msg`/`ShortMsg` distinction, this 
> > > part of the code also adds the extra `LeftNote` (as a remnant from an 
> > > earlier internal version of this checker), and that's that's what I'd 
> > > like to merge into `Msg` (following NoQ's suggestion and keeping it 
> > > distinct from the `ShortMsg`).
> > Among notes, my only planned change is that instead of 
> > 
> > > Warning: "Left shift of '1024' overflows the capacity of 'int'"
> > > CXX Note: "Left shift of '1024' is undefined because 'int' can hold only 
> > > 32 bits (including the sign bit), so some bits overflow"
> > > CXX Note: "The value '1024' is represented by 11 bits, allowing at most 
> > > 21 bits for bitshift"
> > > C Note: "Left shift of '1024' is undefined because 'int' can hold only 31 
> > > bits (excluding the sign bit), so some bits overflow"
> > > C Note: "The value '1024' is represented by 11 bits, allowing at most 20 
> > > bits for bitshift"
> > 
> > I'll implement something like
> > 
> > > Warning: "Left shift of '1024' overflows the capacity of 'int'"
> > > CXX Note: "Left shift of '1024' (represented by 11 bits) is undefined 
> > > because 'int' can hold only 32 bits (including the sign bit), so some 
> > > bits overflow"
> > > C Note: "Left shift of '1024' (represented by 11 bits) is undefined 
> > > because 'int' can hold only 31 bits (excluding the sign bit), so some 
> > > bits overflow"
> Correction: now I'm leaning towards just discarding the secondary note, 
> because the message examples listed in the previous comment are just the 
> variants where the right operand is unknown. In the more detailed message 
> template "The shift '{0} << {1}' is undefined {2}, so {3} bit{4} overflow{5}" 
> there is no place to insert the "represented by {} bits" message.
> 
There's nothing wrong with long, multi-sentence diagnostic messages!

Unlike the compiler proper, we aren't typically used from the command line, so 
we aren't trying to fit into 80 columns. So we start our warnings with a 
capital letter and expect them to be, at the very least, complete sentences.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D156312

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

Reply via email to