On Tue, Nov 8, 2016 at 11:27 AM, Douglas Katzman <do...@google.com> wrote:
> oh, sorry for missing this email. > I'll say "no" - I was hoping you'd audit it! > We do indeed have this practice for post-commit audit, but only for the authors or active maintainers of the piece of code in question. I afraid I do not fully understand the consequences of this patch -- they may be non-trivial. Please initiate a code review (even though the code is already committed). --kcc > > jyknight looked at it and gave me the suggestion to fail the attribute > parsing if, in the non-deprecated syntax, _any_ of the no_sanitize > modifiers are inapplicable to global vars. > > On Tue, Oct 25, 2016 at 7:19 PM, Kostya Serebryany <k...@google.com> wrote: > >> ping >> >> On Mon, Oct 17, 2016 at 5:57 PM, Kostya Serebryany <k...@google.com> >> wrote: >> >>> Did you code-review this? >>> (sorry if I missed it) >>> >>> On Fri, Oct 14, 2016 at 12:55 PM, Douglas Katzman via cfe-commits < >>> cfe-commits@lists.llvm.org> wrote: >>> >>>> Author: dougk >>>> Date: Fri Oct 14 14:55:09 2016 >>>> New Revision: 284272 >>>> >>>> URL: http://llvm.org/viewvc/llvm-project?rev=284272&view=rev >>>> Log: >>>> Implement no_sanitize_address for global vars >>>> >>>> Modified: >>>> cfe/trunk/include/clang/Basic/Attr.td >>>> cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td >>>> cfe/trunk/include/clang/Sema/AttributeList.h >>>> cfe/trunk/lib/CodeGen/SanitizerMetadata.cpp >>>> cfe/trunk/lib/Sema/SemaDeclAttr.cpp >>>> cfe/trunk/test/CodeGen/asan-globals.cpp >>>> cfe/trunk/test/SemaCXX/attr-no-sanitize-address.cpp >>>> cfe/trunk/test/SemaCXX/attr-no-sanitize.cpp >>>> >>>> Modified: cfe/trunk/include/clang/Basic/Attr.td >>>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/ >>>> Basic/Attr.td?rev=284272&r1=284271&r2=284272&view=diff >>>> ============================================================ >>>> ================== >>>> --- cfe/trunk/include/clang/Basic/Attr.td (original) >>>> +++ cfe/trunk/include/clang/Basic/Attr.td Fri Oct 14 14:55:09 2016 >>>> @@ -1705,7 +1705,8 @@ def X86ForceAlignArgPointer : Inheritabl >>>> def NoSanitize : InheritableAttr { >>>> let Spellings = [GNU<"no_sanitize">, CXX11<"clang", "no_sanitize">]; >>>> let Args = [VariadicStringArgument<"Sanitizers">]; >>>> - let Subjects = SubjectList<[Function, ObjCMethod], ErrorDiag>; >>>> + let Subjects = SubjectList<[Function, ObjCMethod, GlobalVar], >>>> ErrorDiag, >>>> + "ExpectedFunctionMethodOrGlobalVar">; >>>> let Documentation = [NoSanitizeDocs]; >>>> let AdditionalMembers = [{ >>>> SanitizerMask getMask() const { >>>> @@ -1727,7 +1728,8 @@ def NoSanitizeSpecific : InheritableAttr >>>> GCC<"no_sanitize_address">, >>>> GCC<"no_sanitize_thread">, >>>> GNU<"no_sanitize_memory">]; >>>> - let Subjects = SubjectList<[Function], ErrorDiag>; >>>> + let Subjects = SubjectList<[Function, GlobalVar], ErrorDiag, >>>> + "ExpectedFunctionGlobalVarMethodOrProperty">; >>>> let Documentation = [NoSanitizeAddressDocs, NoSanitizeThreadDocs, >>>> NoSanitizeMemoryDocs]; >>>> let ASTNode = 0; >>>> >>>> Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td >>>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/ >>>> Basic/DiagnosticSemaKinds.td?rev=284272&r1=284271&r2=284272&view=diff >>>> ============================================================ >>>> ================== >>>> --- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original) >>>> +++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Fri Oct 14 >>>> 14:55:09 2016 >>>> @@ -2577,6 +2577,7 @@ def warn_attribute_wrong_decl_type : War >>>> "|functions, methods and blocks" >>>> "|functions, methods, and classes" >>>> "|functions, methods, and parameters" >>>> + "|functions, methods, and global variables" >>>> "|classes" >>>> "|enums" >>>> "|variables" >>>> >>>> Modified: cfe/trunk/include/clang/Sema/AttributeList.h >>>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/ >>>> Sema/AttributeList.h?rev=284272&r1=284271&r2=284272&view=diff >>>> ============================================================ >>>> ================== >>>> --- cfe/trunk/include/clang/Sema/AttributeList.h (original) >>>> +++ cfe/trunk/include/clang/Sema/AttributeList.h Fri Oct 14 14:55:09 >>>> 2016 >>>> @@ -891,6 +891,7 @@ enum AttributeDeclKind { >>>> ExpectedFunctionMethodOrBlock, >>>> ExpectedFunctionMethodOrClass, >>>> ExpectedFunctionMethodOrParameter, >>>> + ExpectedFunctionMethodOrGlobalVar, >>>> ExpectedClass, >>>> ExpectedEnum, >>>> ExpectedVariable, >>>> >>>> Modified: cfe/trunk/lib/CodeGen/SanitizerMetadata.cpp >>>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/Sa >>>> nitizerMetadata.cpp?rev=284272&r1=284271&r2=284272&view=diff >>>> ============================================================ >>>> ================== >>>> --- cfe/trunk/lib/CodeGen/SanitizerMetadata.cpp (original) >>>> +++ cfe/trunk/lib/CodeGen/SanitizerMetadata.cpp Fri Oct 14 14:55:09 >>>> 2016 >>>> @@ -63,7 +63,13 @@ void SanitizerMetadata::reportGlobalToAS >>>> std::string QualName; >>>> llvm::raw_string_ostream OS(QualName); >>>> D.printQualifiedName(OS); >>>> - reportGlobalToASan(GV, D.getLocation(), OS.str(), D.getType(), >>>> IsDynInit); >>>> + >>>> + bool IsBlacklisted = false; >>>> + for (auto Attr : D.specific_attrs<NoSanitizeAttr>()) >>>> + if (Attr->getMask() & SanitizerKind::Address) >>>> + IsBlacklisted = true; >>>> + reportGlobalToASan(GV, D.getLocation(), OS.str(), D.getType(), >>>> IsDynInit, >>>> + IsBlacklisted); >>>> } >>>> >>>> void SanitizerMetadata::disableSanitizerForGlobal(llvm::GlobalVariable >>>> *GV) { >>>> >>>> Modified: cfe/trunk/lib/Sema/SemaDeclAttr.cpp >>>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaD >>>> eclAttr.cpp?rev=284272&r1=284271&r2=284272&view=diff >>>> ============================================================ >>>> ================== >>>> --- cfe/trunk/lib/Sema/SemaDeclAttr.cpp (original) >>>> +++ cfe/trunk/lib/Sema/SemaDeclAttr.cpp Fri Oct 14 14:55:09 2016 >>>> @@ -5313,9 +5313,15 @@ static void handleDeprecatedAttr(Sema &S >>>> !(Attr.hasScope() && Attr.getScopeName()->isStr("gnu"))) >>>> S.Diag(Attr.getLoc(), diag::ext_cxx14_attr) << Attr.getName(); >>>> >>>> - D->addAttr(::new (S.Context) DeprecatedAttr(Attr.getRange(), >>>> S.Context, Str, >>>> - Replacement, >>>> - Attr.getAttributeSpellingList >>>> Index())); >>>> + D->addAttr(::new (S.Context) >>>> + DeprecatedAttr(Attr.getRange(), S.Context, Str, >>>> Replacement, >>>> + Attr.getAttributeSpellingListI >>>> ndex())); >>>> +} >>>> + >>>> +static bool isGlobalVar(const Decl *D) { >>>> + if (const auto *S = dyn_cast<VarDecl>(D)) >>>> + return S->hasGlobalStorage(); >>>> + return false; >>>> } >>>> >>>> static void handleNoSanitizeAttr(Sema &S, Decl *D, const AttributeList >>>> &Attr) { >>>> @@ -5333,7 +5339,9 @@ static void handleNoSanitizeAttr(Sema &S >>>> >>>> if (parseSanitizerValue(SanitizerName, /*AllowGroups=*/true) == 0) >>>> S.Diag(LiteralLoc, diag::warn_unknown_sanitizer_ignored) << >>>> SanitizerName; >>>> - >>>> + else if (isGlobalVar(D) && SanitizerName != "address") >>>> + S.Diag(D->getLocation(), diag::err_attribute_wrong_decl_type) >>>> + << Attr.getName() << ExpectedFunctionOrMethod; >>>> Sanitizers.push_back(SanitizerName); >>>> } >>>> >>>> @@ -5346,12 +5354,14 @@ static void handleNoSanitizeSpecificAttr >>>> const AttributeList &Attr) { >>>> StringRef AttrName = Attr.getName()->getName(); >>>> normalizeName(AttrName); >>>> - StringRef SanitizerName = >>>> - llvm::StringSwitch<StringRef>(AttrName) >>>> - .Case("no_address_safety_analysis", "address") >>>> - .Case("no_sanitize_address", "address") >>>> - .Case("no_sanitize_thread", "thread") >>>> - .Case("no_sanitize_memory", "memory"); >>>> + StringRef SanitizerName = llvm::StringSwitch<StringRef>(AttrName) >>>> + .Case("no_address_safety_analysis", >>>> "address") >>>> + .Case("no_sanitize_address", "address") >>>> + .Case("no_sanitize_thread", "thread") >>>> + .Case("no_sanitize_memory", "memory"); >>>> + if (isGlobalVar(D) && SanitizerName != "address") >>>> + S.Diag(D->getLocation(), diag::err_attribute_wrong_decl_type) >>>> + << Attr.getName() << ExpectedFunction; >>>> D->addAttr(::new (S.Context) >>>> NoSanitizeAttr(Attr.getRange(), S.Context, >>>> &SanitizerName, 1, >>>> Attr.getAttributeSpellingList >>>> Index())); >>>> >>>> Modified: cfe/trunk/test/CodeGen/asan-globals.cpp >>>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/a >>>> san-globals.cpp?rev=284272&r1=284271&r2=284272&view=diff >>>> ============================================================ >>>> ================== >>>> --- cfe/trunk/test/CodeGen/asan-globals.cpp (original) >>>> +++ cfe/trunk/test/CodeGen/asan-globals.cpp Fri Oct 14 14:55:09 2016 >>>> @@ -7,6 +7,7 @@ >>>> >>>> int global; >>>> int dyn_init_global = global; >>>> +int __attribute__((no_sanitize("address"))) attributed_global; >>>> int blacklisted_global; >>>> >>>> void func() { >>>> @@ -14,24 +15,26 @@ void func() { >>>> const char *literal = "Hello, world!"; >>>> } >>>> >>>> -// CHECK: !llvm.asan.globals = !{![[EXTRA_GLOBAL:[0-9]+]], >>>> ![[GLOBAL:[0-9]+]], ![[DYN_INIT_GLOBAL:[0-9]+]], >>>> ![[BLACKLISTED_GLOBAL:[0-9]+]], ![[STATIC_VAR:[0-9]+]], >>>> ![[LITERAL:[0-9]+]]} >>>> +// CHECK: !llvm.asan.globals = !{![[EXTRA_GLOBAL:[0-9]+]], >>>> ![[GLOBAL:[0-9]+]], ![[DYN_INIT_GLOBAL:[0-9]+]], ![[ATTR_GLOBAL:[0-9]+]], >>>> ![[BLACKLISTED_GLOBAL:[0-9]+]], ![[STATIC_VAR:[0-9]+]], >>>> ![[LITERAL:[0-9]+]]} >>>> // CHECK: ![[EXTRA_GLOBAL]] = !{{{.*}} ![[EXTRA_GLOBAL_LOC:[0-9]+]], >>>> !"extra_global", i1 false, i1 false} >>>> // CHECK: ![[EXTRA_GLOBAL_LOC]] = !{!"{{.*}}extra-source.cpp", i32 1, >>>> i32 5} >>>> // CHECK: ![[GLOBAL]] = !{{{.*}} ![[GLOBAL_LOC:[0-9]+]], !"global", i1 >>>> false, i1 false} >>>> // CHECK: ![[GLOBAL_LOC]] = !{!"{{.*}}asan-globals.cpp", i32 8, i32 5} >>>> // CHECK: ![[DYN_INIT_GLOBAL]] = !{{{.*}} ![[DYN_INIT_LOC:[0-9]+]], >>>> !"dyn_init_global", i1 true, i1 false} >>>> // CHECK: ![[DYN_INIT_LOC]] = !{!"{{.*}}asan-globals.cpp", i32 9, i32 >>>> 5} >>>> +// CHECK: ![[ATTR_GLOBAL]] = !{{{.*}}, null, null, i1 false, i1 true} >>>> // CHECK: ![[BLACKLISTED_GLOBAL]] = !{{{.*}}, null, null, i1 false, i1 >>>> true} >>>> // CHECK: ![[STATIC_VAR]] = !{{{.*}} ![[STATIC_LOC:[0-9]+]], >>>> !"static_var", i1 false, i1 false} >>>> -// CHECK: ![[STATIC_LOC]] = !{!"{{.*}}asan-globals.cpp", i32 13, i32 >>>> 14} >>>> +// CHECK: ![[STATIC_LOC]] = !{!"{{.*}}asan-globals.cpp", i32 14, i32 >>>> 14} >>>> // CHECK: ![[LITERAL]] = !{{{.*}} ![[LITERAL_LOC:[0-9]+]], !"<string >>>> literal>", i1 false, i1 false} >>>> -// CHECK: ![[LITERAL_LOC]] = !{!"{{.*}}asan-globals.cpp", i32 14, i32 >>>> 25} >>>> +// CHECK: ![[LITERAL_LOC]] = !{!"{{.*}}asan-globals.cpp", i32 15, i32 >>>> 25} >>>> >>>> -// BLACKLIST-SRC: !llvm.asan.globals = !{![[EXTRA_GLOBAL:[0-9]+]], >>>> ![[GLOBAL:[0-9]+]], ![[DYN_INIT_GLOBAL:[0-9]+]], >>>> ![[BLACKLISTED_GLOBAL:[0-9]+]], ![[STATIC_VAR:[0-9]+]], >>>> ![[LITERAL:[0-9]+]]} >>>> +// BLACKLIST-SRC: !llvm.asan.globals = !{![[EXTRA_GLOBAL:[0-9]+]], >>>> ![[GLOBAL:[0-9]+]], ![[DYN_INIT_GLOBAL:[0-9]+]], ![[ATTR_GLOBAL:[0-9]+]], >>>> ![[BLACKLISTED_GLOBAL:[0-9]+]], ![[STATIC_VAR:[0-9]+]], >>>> ![[LITERAL:[0-9]+]]} >>>> // BLACKLIST-SRC: ![[EXTRA_GLOBAL]] = !{{{.*}} >>>> ![[EXTRA_GLOBAL_LOC:[0-9]+]], !"extra_global", i1 false, i1 false} >>>> // BLACKLIST-SRC: ![[EXTRA_GLOBAL_LOC]] = !{!"{{.*}}extra-source.cpp", >>>> i32 1, i32 5} >>>> // BLACKLIST-SRC: ![[GLOBAL]] = !{{{.*}} null, null, i1 false, i1 true} >>>> // BLACKLIST-SRC: ![[DYN_INIT_GLOBAL]] = !{{{.*}} null, null, i1 true, >>>> i1 true} >>>> +// BLACKLIST-SRC: ![[ATTR_GLOBAL]] = !{{{.*}}, null, null, i1 false, >>>> i1 true} >>>> // BLACKLIST-SRC: ![[BLACKLISTED_GLOBAL]] = !{{{.*}}, null, null, i1 >>>> false, i1 true} >>>> // BLACKLIST-SRC: ![[STATIC_VAR]] = !{{{.*}} null, null, i1 false, i1 >>>> true} >>>> // BLACKLIST-SRC: ![[LITERAL]] = !{{{.*}} null, null, i1 false, i1 >>>> true} >>>> >>>> Modified: cfe/trunk/test/SemaCXX/attr-no-sanitize-address.cpp >>>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/a >>>> ttr-no-sanitize-address.cpp?rev=284272&r1=284271&r2=284272&view=diff >>>> ============================================================ >>>> ================== >>>> --- cfe/trunk/test/SemaCXX/attr-no-sanitize-address.cpp (original) >>>> +++ cfe/trunk/test/SemaCXX/attr-no-sanitize-address.cpp Fri Oct 14 >>>> 14:55:09 2016 >>>> @@ -21,9 +21,6 @@ int noanal_testfn(int y) { >>>> return x; >>>> } >>>> >>>> -int noanal_test_var NO_SANITIZE_ADDRESS; // \ >>>> - // expected-error {{'no_sanitize_address' attribute only applies to >>>> functions}} >>>> - >>>> class NoanalFoo { >>>> private: >>>> int test_field NO_SANITIZE_ADDRESS; // \ >>>> >>>> Modified: cfe/trunk/test/SemaCXX/attr-no-sanitize.cpp >>>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/a >>>> ttr-no-sanitize.cpp?rev=284272&r1=284271&r2=284272&view=diff >>>> ============================================================ >>>> ================== >>>> --- cfe/trunk/test/SemaCXX/attr-no-sanitize.cpp (original) >>>> +++ cfe/trunk/test/SemaCXX/attr-no-sanitize.cpp Fri Oct 14 14:55:09 >>>> 2016 >>>> @@ -2,8 +2,6 @@ >>>> // RUN: not %clang_cc1 -std=c++11 -ast-dump %s | FileCheck >>>> --check-prefix=DUMP %s >>>> // RUN: not %clang_cc1 -std=c++11 -ast-print %s | FileCheck >>>> --check-prefix=PRINT %s >>>> >>>> -int v1 __attribute__((no_sanitize("address"))); // >>>> expected-error{{'no_sanitize' attribute only applies to functions and >>>> methods}} >>>> - >>>> int f1() __attribute__((no_sanitize)); // >>>> expected-error{{'no_sanitize' attribute takes at least 1 argument}} >>>> >>>> int f2() __attribute__((no_sanitize(1))); // >>>> expected-error{{'no_sanitize' attribute requires a string}} >>>> >>>> >>>> _______________________________________________ >>>> cfe-commits mailing list >>>> cfe-commits@lists.llvm.org >>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits >>>> >>> >>> >> >
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits