r284272 - Implement no_sanitize_address for global vars

Douglas Katzman via cfe-commits cfe-commits at lists.llvm.org
Tue Nov 8 11:27:15 PST 2016


oh, sorry for missing this email.
I'll say "no" - I was hoping you'd audit it!

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 <kcc at google.com> wrote:

> ping
>
> On Mon, Oct 17, 2016 at 5:57 PM, Kostya Serebryany <kcc at 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 at 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.getAttributeSpellingListIndex()));
>>> +}
>>> +
>>> +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.getAttributeSpellingListIndex()));
>>>
>>> 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 at lists.llvm.org
>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>>>
>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20161108/3b18c562/attachment-0001.html>


More information about the cfe-commits mailing list