xazax.hun added inline comments.

================
Comment at: clang/lib/Analysis/UnsafeBufferUsage.cpp:168-169
+  static Matcher matcher() {
+    // FIXME: What if the index is integer literal 0? Should this be
+    // a safe gadget in this case?
+    return stmt(
----------------
NoQ wrote:
> aaron.ballman wrote:
> > xazax.hun wrote:
> > > As per some of the discussions, in the future the compiler might be able 
> > > to recognize certain safe patterns, e.g., when there is a simple for loop 
> > > with known bounds, or when both the index and the array size is 
> > > statically known.
> > > 
> > > I think here we need to make a very important design decision: Do we want 
> > > the gadgets to have the right "safety" category when it is created (e.g., 
> > > we have to be able to decide if a gadget is safe or not using matchers), 
> > > or do we want some mechanisms to be able to promote an unsafe gadget to 
> > > be a safe one? (E.g., do we want to be able to prove some unsafe gadgets 
> > > safe using dataflow analysis in a later pass?)
> > (FWIW, this is a great question and I really appreciate you asking it!)
> My original design implies that safe gadgets are a separate hierarchy, so 
> there will be a new gadget class for index zero, and this gadget will be 
> changed to skip index zero. But I don't immediately see why such early 
> separation is strictly necessary, other than for a bit of extra type safety 
> (extra virtual methods of the `UnsafeGadget` class don't make sense on safe 
> gadgets). We *do* have time to make this distinction later, before we get to 
> emitting warnings.
> 
> So maybe eventually we'll end up replacing `isSafe()` with a pure virtual 
> method and deprecate `SafeGadget` and `UnsafeGadget` base classes, if we see 
> it cause too much duplication or it turns out that the extra analysis 
> necessary to establish safety can't be nicely implemented in ASTMatchers. In 
> this case I'll admit that I over-engineered it a bit.
I'd strongly prefer `isSafe()` method over inheritance. While adding safe and 
unsafe gadgets for zero indices is not too bad, if we plan to expand this to 
more cases, like known array size + compile time constant index, it will get 
harder and harder to keep all the gadgets in sync. We can end up missing cases 
or detecting a code snippet both as safe and unsafe. The `isSafe` method would 
basically get rid of a whole class of problems, where safe and unsafe versions 
of the gadgets are overlapping. That being said, I am not insisting doing this 
change in this PR, it is OK doing the change later in a follow-up.


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

https://reviews.llvm.org/D137379

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

Reply via email to