forked from OSchip/llvm-project
Do not use the incorrect attribute spelling list index when translating a no_sanitize_foo attribute into a no_sanitize("foo") attribute.
This fixes a crash when AST pretty printing declarations marked with no_sanitize_memory. llvm-svn: 361274
This commit is contained in:
parent
c0a4f45bcb
commit
31ca49be47
|
@ -6329,9 +6329,21 @@ static void handleNoSanitizeSpecificAttr(Sema &S, Decl *D,
|
|||
if (isGlobalVar(D) && SanitizerName != "address")
|
||||
S.Diag(D->getLocation(), diag::err_attribute_wrong_decl_type)
|
||||
<< AL << ExpectedFunction;
|
||||
D->addAttr(::new (S.Context)
|
||||
NoSanitizeAttr(AL.getRange(), S.Context, &SanitizerName, 1,
|
||||
AL.getAttributeSpellingListIndex()));
|
||||
|
||||
// FIXME: Rather than create a NoSanitizeSpecificAttr, this creates a
|
||||
// NoSanitizeAttr object; but we need to calculate the correct spelling list
|
||||
// index rather than incorrectly assume the index for NoSanitizeSpecificAttr
|
||||
// has the same spellings as the index for NoSanitizeAttr. We don't have a
|
||||
// general way to "translate" between the two, so this hack attempts to work
|
||||
// around the issue with hard-coded indicies. This is critical for calling
|
||||
// getSpelling() or prettyPrint() on the resulting semantic attribute object
|
||||
// without failing assertions.
|
||||
unsigned TranslatedSpellingIndex = 0;
|
||||
if (AL.isC2xAttribute() || AL.isCXX11Attribute())
|
||||
TranslatedSpellingIndex = 1;
|
||||
|
||||
D->addAttr(::new (S.Context) NoSanitizeAttr(
|
||||
AL.getRange(), S.Context, &SanitizerName, 1, TranslatedSpellingIndex));
|
||||
}
|
||||
|
||||
static void handleInternalLinkageAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
|
||||
|
|
|
@ -0,0 +1,7 @@
|
|||
// RUN: %clang_cc1 -std=c++11 -ast-print %s -o - | FileCheck %s
|
||||
|
||||
void should_not_crash_1() __attribute__((no_sanitize_memory));
|
||||
[[clang::no_sanitize_memory]] void should_not_crash_2();
|
||||
|
||||
// CHECK: void should_not_crash_1() __attribute__((no_sanitize("memory")));
|
||||
// CHECK: void should_not_crash_2() {{\[\[}}clang::no_sanitize("memory"){{\]\]}};
|
Loading…
Reference in New Issue