aaron.ballman added inline comments.

================
Comment at: clang/include/clang/Basic/Attr.td:2945
+  let Spellings = [Clang<"disable_sanitizer_instrumentation">];
+  let Subjects = SubjectList<[Function]>;
+  let Documentation = [DisableSanitizerInstrumentationDocs];
----------------
Do we want this to also appertain to `GlobalVar` and `ObjCMethod` so it's got 
the same subjects as `no_sanitize`?


================
Comment at: clang/include/clang/Basic/AttrDocs.td:2601-2602
+
+This is not the same as ``__attribute__((no_sanitize(...)))``, which depending
+on the tool may still insert instrumentation to prevent false positive reports.
+  }];
----------------
glider wrote:
> aaron.ballman wrote:
> > melver wrote:
> > > aaron.ballman wrote:
> > > > glider wrote:
> > > > > aaron.ballman wrote:
> > > > > > Has there been agreement that this isn't actually a bug? My 
> > > > > > understanding of `no_sanitize` is that it disables sanitizer 
> > > > > > support for a function or global. The documentation for that 
> > > > > > attribute says:
> > > > > > ```
> > > > > > Use the ``no_sanitize`` attribute on a function or a global variable
> > > > > > declaration to specify that a particular instrumentation or set of
> > > > > > instrumentations should not be applied.
> > > > > > ```
> > > > > > That sure reads like "do not instrument this at all" to me, and 
> > > > > > makes me think we don't need a second attribute that says "no, 
> > > > > > really, I mean it this time."
> > > > > No, this isn't a bug, but might need to be better clarified in the 
> > > > > docs.
> > > > > ThreadSanitizer and MemorySanitizer do insert some instrumentation 
> > > > > into ignore functions to prevent false positives:
> > > > > 
> > > > > > ThreadSanitizer still instruments such functions to avoid false 
> > > > > > positives and provide meaningful stack traces.
> > > > > 
> > > > > (https://clang.llvm.org/docs/ThreadSanitizer.html#attribute-no-sanitize-thread)
> > > > > 
> > > > > and 
> > > > > 
> > > > > > MemorySanitizer may still instrument such functions to avoid false 
> > > > > > positives.
> > > > > 
> > > > > (https://clang.llvm.org/docs/MemorySanitizer.html#attribute-no-sanitize-memory)
> > > > > 
> > > > > This is the behavior people rely onto, although at this point I don't 
> > > > > think `no_sanitize(...)` is the best name for attribute not disabling 
> > > > > instrumentation completely.
> > > > Thank you for the information!
> > > > 
> > > > Having two attributes with basically the same name to perform this 
> > > > functionality is confusing because users (understandably) will reach 
> > > > for the succinctly named one and make assumptions about what it does 
> > > > from the name.
> > > > 
> > > > One possibility would be to change `no_sanitize` to take an additional 
> > > > argument, as in: `__attribute__((no_sanitize(fully_disable, 
> > > > "thread")))`. Perhaps another solution would be to give the proposed 
> > > > attribute a more distinct name, like 
> > > > `disable_sanitizer_instrumentation`, 
> > > > `sanitizer_instrumentation_disabled`, or something else.
> > > Last I looked at `no_sanitize`, it's quite awkward that it is an 
> > > attribute that accepts arguments, because it makes it very hard to query 
> > > for existence of attribute additions/changes with `__has_attribute()`. 
> > > Given this new attribute is meant to be semantically quite different, the 
> > > cleaner and less intrusive way with that in mind is to create a new 
> > > attribute. Unless of course there's a nice way to make 
> > > `__has_attribute()` work.
> > > 
> > > Here's another suggestion for name, which actually makes the difference 
> > > between `no_sanitize` and the new one obvious: 
> > > `no_sanitize_any_permit_false_positives`
> > > 
> > > At least it would semantically tell a user what might happen, which in 
> > > turn would hopefully make them avoid this attribute (also because it's 
> > > hard enough to type) unless they are absolutely sure.
> > > Given this new attribute is meant to be semantically quite different, the 
> > > cleaner and less intrusive way with that in mind is to create a new 
> > > attribute. Unless of course there's a nice way to make __has_attribute() 
> > > work.
> > 
> > That sounds like good rationale for a separate attribute.
> > 
> > > Here's another suggestion for name, which actually makes the difference 
> > > between no_sanitize and the new one obvious: 
> > > no_sanitize_any_permit_false_positives
> > >
> > > At least it would semantically tell a user what might happen, which in 
> > > turn would hopefully make them avoid this attribute (also because it's 
> > > hard enough to type) unless they are absolutely sure.
> > 
> > That would certainly solve my concerns! Do you envision this being used far 
> > less often than `no_sanitize`? (That's my intuition, so I'm just 
> > double-checking that this isn't expected to be a popular replacement or 
> > something where the long name may be really undesirable.)
> Yes, right now we only want to apply this attribute to a couple of critical 
> places in the Linux kernel.
> Other users may pop up in e.g. other kernels (NetBSD is using KMSAN) and 
> maybe userspace programs, but we don't expect it to be popular, so having a 
> lengthy attribute name is fine.
Fantastic, thank you for the confirmation!


================
Comment at: clang/lib/CodeGen/CodeGenFunction.cpp:526-528
+  if (CurFuncDecl->hasAttr<DisableSanitizerInstrumentationAttr>())
+    return true;
+  return false;
----------------



Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D108029

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

Reply via email to