[PATCH] Implement nonnull-attribute sanitizer
Richard Smith
richard at metafoo.co.uk
Tue Aug 26 16:51:52 PDT 2014
================
Comment at: projects/compiler-rt/lib/ubsan/ubsan_handlers.cc:355
@@ +354,3 @@
+
+static void handleNonnullArg(NonNullArgData *Data, ValueHandle ArgIndex,
+ ReportOptions Opts) {
----------------
Please consistently use either `NonNull` or `Nonnull`.
================
Comment at: tools/clang/lib/CodeGen/CGCall.cpp:2414-2415
@@ +2413,4 @@
+ unsigned ParmNum) {
+ if (!CGF.SanOpts->NonnullAttribute || !FD || ParmNum >= FD->getNumParams())
+ return;
+ const NonNullAttr *NNAtt = FD->getAttr<NonNullAttr>();
----------------
What should happen here:
__attribute__((nonnull)) void f(const char *, ...);
int main() { void *p = 0; f("%s", p); }
(I have no idea if the attribute applies in this case.)
================
Comment at: tools/clang/lib/CodeGen/CGCall.cpp:2416-2420
@@ +2415,7 @@
+ return;
+ const NonNullAttr *NNAtt = FD->getAttr<NonNullAttr>();
+ auto PVD = FD->getParamDecl(ParmNum);
+ if (!(NNAtt && NNAtt->isNonNull(PVD->getFunctionScopeIndex())) &&
+ !PVD->hasAttr<NonNullAttr>())
+ return;
+ CodeGenFunction::SanitizerScope SanScope(&CGF);
----------------
Can a function have multiple `__attribute__((nonnull(N)))`s on it?
================
Comment at: tools/clang/lib/CodeGen/CGCall.cpp:2422
@@ +2421,3 @@
+ CodeGenFunction::SanitizerScope SanScope(&CGF);
+ assert(RV.isScalar());
+ llvm::Value *V = RV.getScalarVal();
----------------
What guarantees this? I don't see where you're checking that the parameter is of a pointer type.
http://reviews.llvm.org/D5082
More information about the cfe-commits
mailing list