<div dir="ltr">oh, sorry for missing this email.<div>I'll say "no" - I was hoping you'd audit it!</div><div><br><div>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.</div></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Oct 25, 2016 at 7:19 PM, Kostya Serebryany <span dir="ltr"><<a href="mailto:kcc@google.com" target="_blank">kcc@google.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">ping</div><div class="HOEnZb"><div class="h5"><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Oct 17, 2016 at 5:57 PM, Kostya Serebryany <span dir="ltr"><<a href="mailto:kcc@google.com" target="_blank">kcc@google.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Did you code-review this? <div>(sorry if I missed it)</div></div><div class="m_7723379437909337746HOEnZb"><div class="m_7723379437909337746h5"><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Oct 14, 2016 at 12:55 PM, Douglas Katzman via cfe-commits <span dir="ltr"><<a href="mailto:cfe-commits@lists.llvm.org" target="_blank">cfe-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: dougk<br>
Date: Fri Oct 14 14:55:09 2016<br>
New Revision: 284272<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=284272&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject?rev=284272&view=rev</a><br>
Log:<br>
Implement no_sanitize_address for global vars<br>
<br>
Modified:<br>
    cfe/trunk/include/clang/Basic/<wbr>Attr.td<br>
    cfe/trunk/include/clang/Basic/<wbr>DiagnosticSemaKinds.td<br>
    cfe/trunk/include/clang/Sema/A<wbr>ttributeList.h<br>
    cfe/trunk/lib/CodeGen/Sanitize<wbr>rMetadata.cpp<br>
    cfe/trunk/lib/Sema/SemaDeclAtt<wbr>r.cpp<br>
    cfe/trunk/test/CodeGen/asan-gl<wbr>obals.cpp<br>
    cfe/trunk/test/SemaCXX/attr-no<wbr>-sanitize-address.cpp<br>
    cfe/trunk/test/SemaCXX/attr-no<wbr>-sanitize.cpp<br>
<br>
Modified: cfe/trunk/include/clang/Basic/<wbr>Attr.td<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/Attr.td?rev=284272&r1=284271&r2=284272&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/cfe/trunk/include/clang/<wbr>Basic/Attr.td?rev=284272&r1=28<wbr>4271&r2=284272&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/include/clang/Basic/<wbr>Attr.td (original)<br>
+++ cfe/trunk/include/clang/Basic/<wbr>Attr.td Fri Oct 14 14:55:09 2016<br>
@@ -1705,7 +1705,8 @@ def X86ForceAlignArgPointer : Inheritabl<br>
 def NoSanitize : InheritableAttr {<br>
   let Spellings = [GNU<"no_sanitize">, CXX11<"clang", "no_sanitize">];<br>
   let Args = [VariadicStringArgument<"Sanit<wbr>izers">];<br>
-  let Subjects = SubjectList<[Function, ObjCMethod], ErrorDiag>;<br>
+  let Subjects = SubjectList<[Function, ObjCMethod, GlobalVar], ErrorDiag,<br>
+    "ExpectedFunctionMethodOrGloba<wbr>lVar">;<br>
   let Documentation = [NoSanitizeDocs];<br>
   let AdditionalMembers = [{<br>
     SanitizerMask getMask() const {<br>
@@ -1727,7 +1728,8 @@ def NoSanitizeSpecific : InheritableAttr<br>
                    GCC<"no_sanitize_address">,<br>
                    GCC<"no_sanitize_thread">,<br>
                    GNU<"no_sanitize_memory">];<br>
-  let Subjects = SubjectList<[Function], ErrorDiag>;<br>
+  let Subjects = SubjectList<[Function, GlobalVar], ErrorDiag,<br>
+        "ExpectedFunctionGlobalVarMeth<wbr>odOrProperty">;<br>
   let Documentation = [NoSanitizeAddressDocs, NoSanitizeThreadDocs,<br>
                        NoSanitizeMemoryDocs];<br>
   let ASTNode = 0;<br>
<br>
Modified: cfe/trunk/include/clang/Basic/<wbr>DiagnosticSemaKinds.td<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=284272&r1=284271&r2=284272&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/cfe/trunk/include/clang/<wbr>Basic/DiagnosticSemaKinds.td?r<wbr>ev=284272&r1=284271&r2=284272&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/include/clang/Basic/<wbr>DiagnosticSemaKinds.td (original)<br>
+++ cfe/trunk/include/clang/Basic/<wbr>DiagnosticSemaKinds.td Fri Oct 14 14:55:09 2016<br>
@@ -2577,6 +2577,7 @@ def warn_attribute_wrong_decl_type : War<br>
   "|functions, methods and blocks"<br>
   "|functions, methods, and classes"<br>
   "|functions, methods, and parameters"<br>
+  "|functions, methods, and global variables"<br>
   "|classes"<br>
   "|enums"<br>
   "|variables"<br>
<br>
Modified: cfe/trunk/include/clang/Sema/A<wbr>ttributeList.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Sema/AttributeList.h?rev=284272&r1=284271&r2=284272&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/cfe/trunk/include/clang/<wbr>Sema/AttributeList.h?rev=28427<wbr>2&r1=284271&r2=284272&view=<wbr>diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/include/clang/Sema/A<wbr>ttributeList.h (original)<br>
+++ cfe/trunk/include/clang/Sema/A<wbr>ttributeList.h Fri Oct 14 14:55:09 2016<br>
@@ -891,6 +891,7 @@ enum AttributeDeclKind {<br>
   ExpectedFunctionMethodOrBlock<wbr>,<br>
   ExpectedFunctionMethodOrClass<wbr>,<br>
   ExpectedFunctionMethodOrParam<wbr>eter,<br>
+  ExpectedFunctionMethodOrGlobal<wbr>Var,<br>
   ExpectedClass,<br>
   ExpectedEnum,<br>
   ExpectedVariable,<br>
<br>
Modified: cfe/trunk/lib/CodeGen/Sanitize<wbr>rMetadata.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/SanitizerMetadata.cpp?rev=284272&r1=284271&r2=284272&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/cfe/trunk/lib/CodeGen/Sa<wbr>nitizerMetadata.cpp?rev=284272<wbr>&r1=284271&r2=284272&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/lib/CodeGen/Sanitize<wbr>rMetadata.cpp (original)<br>
+++ cfe/trunk/lib/CodeGen/Sanitize<wbr>rMetadata.cpp Fri Oct 14 14:55:09 2016<br>
@@ -63,7 +63,13 @@ void SanitizerMetadata::reportGloba<wbr>lToAS<br>
   std::string QualName;<br>
   llvm::raw_string_ostream OS(QualName);<br>
   D.printQualifiedName(OS);<br>
-  reportGlobalToASan(GV, D.getLocation(), OS.str(), D.getType(), IsDynInit);<br>
+<br>
+  bool IsBlacklisted = false;<br>
+  for (auto Attr : D.specific_attrs<NoSanitizeAtt<wbr>r>())<br>
+    if (Attr->getMask() & SanitizerKind::Address)<br>
+      IsBlacklisted = true;<br>
+  reportGlobalToASan(GV, D.getLocation(), OS.str(), D.getType(), IsDynInit,<br>
+                     IsBlacklisted);<br>
 }<br>
<br>
 void SanitizerMetadata::disableSani<wbr>tizerForGlobal(llvm::GlobalVar<wbr>iable *GV) {<br>
<br>
Modified: cfe/trunk/lib/Sema/SemaDeclAtt<wbr>r.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclAttr.cpp?rev=284272&r1=284271&r2=284272&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/cfe/trunk/lib/Sema/SemaD<wbr>eclAttr.cpp?rev=284272&r1=2842<wbr>71&r2=284272&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/lib/Sema/SemaDeclAtt<wbr>r.cpp (original)<br>
+++ cfe/trunk/lib/Sema/SemaDeclAtt<wbr>r.cpp Fri Oct 14 14:55:09 2016<br>
@@ -5313,9 +5313,15 @@ static void handleDeprecatedAttr(Sema &S<br>
         !(Attr.hasScope() && Attr.getScopeName()->isStr("gn<wbr>u")))<br>
       S.Diag(Attr.getLoc(), diag::ext_cxx14_attr) << Attr.getName();<br>
<br>
-  D->addAttr(::new (S.Context) DeprecatedAttr(Attr.getRange()<wbr>, S.Context, Str,<br>
-                                   Replacement,<br>
-                                   Attr.getAttributeSpellingList<wbr>Index()));<br>
+  D->addAttr(::new (S.Context)<br>
+                 DeprecatedAttr(Attr.getRange(<wbr>), S.Context, Str, Replacement,<br>
+                                Attr.getAttributeSpellingListI<wbr>ndex()));<br>
+}<br>
+<br>
+static bool isGlobalVar(const Decl *D) {<br>
+  if (const auto *S = dyn_cast<VarDecl>(D))<br>
+    return S->hasGlobalStorage();<br>
+  return false;<br>
 }<br>
<br>
 static void handleNoSanitizeAttr(Sema &S, Decl *D, const AttributeList &Attr) {<br>
@@ -5333,7 +5339,9 @@ static void handleNoSanitizeAttr(Sema &S<br>
<br>
     if (parseSanitizerValue(Sanitizer<wbr>Name, /*AllowGroups=*/true) == 0)<br>
       S.Diag(LiteralLoc, diag::warn_unknown_sanitizer_i<wbr>gnored) << SanitizerName;<br>
-<br>
+    else if (isGlobalVar(D) && SanitizerName != "address")<br>
+      S.Diag(D->getLocation(), diag::err_attribute_wrong_decl<wbr>_type)<br>
+          << Attr.getName() << ExpectedFunctionOrMethod;<br>
     Sanitizers.push_back(Sanitize<wbr>rName);<br>
   }<br>
<br>
@@ -5346,12 +5354,14 @@ static void handleNoSanitizeSpecificAttr<br>
                                          const AttributeList &Attr) {<br>
   StringRef AttrName = Attr.getName()->getName();<br>
   normalizeName(AttrName);<br>
-  StringRef SanitizerName =<br>
-      llvm::StringSwitch<StringRef>(<wbr>AttrName)<br>
-          .Case("no_address_safety_analy<wbr>sis", "address")<br>
-          .Case("no_sanitize_address", "address")<br>
-          .Case("no_sanitize_thread", "thread")<br>
-          .Case("no_sanitize_memory", "memory");<br>
+  StringRef SanitizerName = llvm::StringSwitch<StringRef>(<wbr>AttrName)<br>
+                                .Case("no_address_safety_analy<wbr>sis", "address")<br>
+                                .Case("no_sanitize_address", "address")<br>
+                                .Case("no_sanitize_thread", "thread")<br>
+                                .Case("no_sanitize_memory", "memory");<br>
+  if (isGlobalVar(D) && SanitizerName != "address")<br>
+    S.Diag(D->getLocation(), diag::err_attribute_wrong_decl<wbr>_type)<br>
+        << Attr.getName() << ExpectedFunction;<br>
   D->addAttr(::new (S.Context)<br>
                  NoSanitizeAttr(Attr.getRange()<wbr>, S.Context, &SanitizerName, 1,<br>
                                 Attr.getAttributeSpellingList<wbr>Index()));<br>
<br>
Modified: cfe/trunk/test/CodeGen/asan-gl<wbr>obals.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/asan-globals.cpp?rev=284272&r1=284271&r2=284272&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/cfe/trunk/test/CodeGen/a<wbr>san-globals.cpp?rev=284272&r1=<wbr>284271&r2=284272&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/test/CodeGen/asan-gl<wbr>obals.cpp (original)<br>
+++ cfe/trunk/test/CodeGen/asan-gl<wbr>obals.cpp Fri Oct 14 14:55:09 2016<br>
@@ -7,6 +7,7 @@<br>
<br>
 int global;<br>
 int dyn_init_global = global;<br>
+int __attribute__((no_sanitize("ad<wbr>dress"))) attributed_global;<br>
 int blacklisted_global;<br>
<br>
 void func() {<br>
@@ -14,24 +15,26 @@ void func() {<br>
   const char *literal = "Hello, world!";<br>
 }<br>
<br>
-// CHECK: !llvm.asan.globals = !{![[EXTRA_GLOBAL:[0-9]+]], ![[GLOBAL:[0-9]+]], ![[DYN_INIT_GLOBAL:[0-9]+]], ![[BLACKLISTED_GLOBAL:[0-9]+]]<wbr>, ![[STATIC_VAR:[0-9]+]], ![[LITERAL:[0-9]+]]}<br>
+// CHECK: !llvm.asan.globals = !{![[EXTRA_GLOBAL:[0-9]+]], ![[GLOBAL:[0-9]+]], ![[DYN_INIT_GLOBAL:[0-9]+]], ![[ATTR_GLOBAL:[0-9]+]], ![[BLACKLISTED_GLOBAL:[0-9]+]]<wbr>, ![[STATIC_VAR:[0-9]+]], ![[LITERAL:[0-9]+]]}<br>
 // CHECK: ![[EXTRA_GLOBAL]] = !{{{.*}} ![[EXTRA_GLOBAL_LOC:[0-9]+]], !"extra_global", i1 false, i1 false}<br>
 // CHECK: ![[EXTRA_GLOBAL_LOC]] = !{!"{{.*}}extra-source.cpp", i32 1, i32 5}<br>
 // CHECK: ![[GLOBAL]] = !{{{.*}} ![[GLOBAL_LOC:[0-9]+]], !"global", i1 false, i1 false}<br>
 // CHECK: ![[GLOBAL_LOC]] = !{!"{{.*}}asan-globals.cpp", i32 8, i32 5}<br>
 // CHECK: ![[DYN_INIT_GLOBAL]] = !{{{.*}} ![[DYN_INIT_LOC:[0-9]+]], !"dyn_init_global", i1 true, i1 false}<br>
 // CHECK: ![[DYN_INIT_LOC]] = !{!"{{.*}}asan-globals.cpp", i32 9, i32 5}<br>
+// CHECK: ![[ATTR_GLOBAL]] = !{{{.*}}, null, null, i1 false, i1 true}<br>
 // CHECK: ![[BLACKLISTED_GLOBAL]] = !{{{.*}}, null, null, i1 false, i1 true}<br>
 // CHECK: ![[STATIC_VAR]] = !{{{.*}} ![[STATIC_LOC:[0-9]+]], !"static_var", i1 false, i1 false}<br>
-// CHECK: ![[STATIC_LOC]] = !{!"{{.*}}asan-globals.cpp", i32 13, i32 14}<br>
+// CHECK: ![[STATIC_LOC]] = !{!"{{.*}}asan-globals.cpp", i32 14, i32 14}<br>
 // CHECK: ![[LITERAL]] = !{{{.*}} ![[LITERAL_LOC:[0-9]+]], !"<string literal>", i1 false, i1 false}<br>
-// CHECK: ![[LITERAL_LOC]] = !{!"{{.*}}asan-globals.cpp", i32 14, i32 25}<br>
+// CHECK: ![[LITERAL_LOC]] = !{!"{{.*}}asan-globals.cpp", i32 15, i32 25}<br>
<br>
-// BLACKLIST-SRC: !llvm.asan.globals = !{![[EXTRA_GLOBAL:[0-9]+]], ![[GLOBAL:[0-9]+]], ![[DYN_INIT_GLOBAL:[0-9]+]], ![[BLACKLISTED_GLOBAL:[0-9]+]]<wbr>, ![[STATIC_VAR:[0-9]+]], ![[LITERAL:[0-9]+]]}<br>
+// 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]+]]<wbr>, ![[STATIC_VAR:[0-9]+]], ![[LITERAL:[0-9]+]]}<br>
 // BLACKLIST-SRC: ![[EXTRA_GLOBAL]] = !{{{.*}} ![[EXTRA_GLOBAL_LOC:[0-9]+]], !"extra_global", i1 false, i1 false}<br>
 // BLACKLIST-SRC: ![[EXTRA_GLOBAL_LOC]] = !{!"{{.*}}extra-source.cpp", i32 1, i32 5}<br>
 // BLACKLIST-SRC: ![[GLOBAL]] = !{{{.*}} null, null, i1 false, i1 true}<br>
 // BLACKLIST-SRC: ![[DYN_INIT_GLOBAL]] = !{{{.*}} null, null, i1 true, i1 true}<br>
+// BLACKLIST-SRC: ![[ATTR_GLOBAL]] = !{{{.*}}, null, null, i1 false, i1 true}<br>
 // BLACKLIST-SRC: ![[BLACKLISTED_GLOBAL]] = !{{{.*}}, null, null, i1 false, i1 true}<br>
 // BLACKLIST-SRC: ![[STATIC_VAR]] = !{{{.*}} null, null, i1 false, i1 true}<br>
 // BLACKLIST-SRC: ![[LITERAL]] = !{{{.*}} null, null, i1 false, i1 true}<br>
<br>
Modified: cfe/trunk/test/SemaCXX/attr-no<wbr>-sanitize-address.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/attr-no-sanitize-address.cpp?rev=284272&r1=284271&r2=284272&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/cfe/trunk/test/SemaCXX/a<wbr>ttr-no-sanitize-address.cpp?re<wbr>v=284272&r1=284271&r2=284272&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/test/SemaCXX/attr-no<wbr>-sanitize-address.cpp (original)<br>
+++ cfe/trunk/test/SemaCXX/attr-no<wbr>-sanitize-address.cpp Fri Oct 14 14:55:09 2016<br>
@@ -21,9 +21,6 @@ int noanal_testfn(int y) {<br>
   return x;<br>
 }<br>
<br>
-int noanal_test_var NO_SANITIZE_ADDRESS; // \<br>
-  // expected-error {{'no_sanitize_address' attribute only applies to functions}}<br>
-<br>
 class NoanalFoo {<br>
  private:<br>
   int test_field NO_SANITIZE_ADDRESS; // \<br>
<br>
Modified: cfe/trunk/test/SemaCXX/attr-no<wbr>-sanitize.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/attr-no-sanitize.cpp?rev=284272&r1=284271&r2=284272&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/cfe/trunk/test/SemaCXX/a<wbr>ttr-no-sanitize.cpp?rev=284272<wbr>&r1=284271&r2=284272&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/test/SemaCXX/attr-no<wbr>-sanitize.cpp (original)<br>
+++ cfe/trunk/test/SemaCXX/attr-no<wbr>-sanitize.cpp Fri Oct 14 14:55:09 2016<br>
@@ -2,8 +2,6 @@<br>
 // RUN: not %clang_cc1 -std=c++11 -ast-dump %s | FileCheck --check-prefix=DUMP %s<br>
 // RUN: not %clang_cc1 -std=c++11 -ast-print %s | FileCheck --check-prefix=PRINT %s<br>
<br>
-int v1 __attribute__((no_sanitize("ad<wbr>dress"))); // expected-error{{'no_sanitize' attribute only applies to functions and methods}}<br>
-<br>
 int f1() __attribute__((no_sanitize)); // expected-error{{'no_sanitize' attribute takes at least 1 argument}}<br>
<br>
 int f2() __attribute__((no_sanitize(1))<wbr>); // expected-error{{'no_sanitize' attribute requires a string}}<br>
<br>
<br>
______________________________<wbr>_________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@lists.llvm.org" target="_blank">cfe-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/cfe-commits</a><br>
</blockquote></div><br></div>
</div></div></blockquote></div><br></div>
</div></div></blockquote></div><br></div>