diff options
Diffstat (limited to 'clang/lib/Sema/SemaDeclAttr.cpp')
-rw-r--r-- | clang/lib/Sema/SemaDeclAttr.cpp | 52 |
1 files changed, 44 insertions, 8 deletions
diff --git a/clang/lib/Sema/SemaDeclAttr.cpp b/clang/lib/Sema/SemaDeclAttr.cpp index 0daeecfda95..4480cff0688 100644 --- a/clang/lib/Sema/SemaDeclAttr.cpp +++ b/clang/lib/Sema/SemaDeclAttr.cpp @@ -4354,6 +4354,45 @@ static void handleDeprecatedAttr(Sema &S, Decl *D, const AttributeList &Attr) { handleAttrWithMessage<DeprecatedAttr>(S, D, Attr); } +static void handleNoSanitizeAttr(Sema &S, Decl *D, const AttributeList &Attr) { + if (!checkAttributeAtLeastNumArgs(S, Attr, 1)) + return; + + std::vector<std::string> Sanitizers; + + for (unsigned I = 0, E = Attr.getNumArgs(); I != E; ++I) { + StringRef SanitizerName; + SourceLocation LiteralLoc; + + if (!S.checkStringLiteralArgumentAttr(Attr, I, SanitizerName, &LiteralLoc)) + return; + + if (parseSanitizerValue(SanitizerName, /*AllowGroups=*/true) == 0) + S.Diag(LiteralLoc, diag::warn_unknown_sanitizer_ignored) << SanitizerName; + + Sanitizers.push_back(SanitizerName); + } + + D->addAttr(::new (S.Context) NoSanitizeAttr( + Attr.getRange(), S.Context, Sanitizers.data(), Sanitizers.size(), + Attr.getAttributeSpellingListIndex())); +} + +static void handleNoSanitizeSpecificAttr(Sema &S, Decl *D, + const AttributeList &Attr) { + std::string SanitizerName = + llvm::StringSwitch<const char *>(Attr.getName()->getName()) + .Case("no_address_safety_analysis", "address") + .Case("no_sanitize_address", "address") + .Case("no_sanitize_thread", "thread") + .Case("no_sanitize_memory", "memory") + .Default(""); + assert(!SanitizerName.empty()); + D->addAttr(::new (S.Context) + NoSanitizeAttr(Attr.getRange(), S.Context, &SanitizerName, 1, + Attr.getAttributeSpellingListIndex())); +} + /// Handles semantic checking for features that are common to all attributes, /// such as checking whether a parameter was properly specified, or the correct /// number of arguments were passed, etc. @@ -4822,18 +4861,15 @@ static void ProcessDeclAttribute(Sema &S, Scope *scope, Decl *D, case AttributeList::AT_ScopedLockable: handleSimpleAttribute<ScopedLockableAttr>(S, D, Attr); break; - case AttributeList::AT_NoSanitizeAddress: - handleSimpleAttribute<NoSanitizeAddressAttr>(S, D, Attr); + case AttributeList::AT_NoSanitize: + handleNoSanitizeAttr(S, D, Attr); + break; + case AttributeList::AT_NoSanitizeSpecific: + handleNoSanitizeSpecificAttr(S, D, Attr); break; case AttributeList::AT_NoThreadSafetyAnalysis: handleSimpleAttribute<NoThreadSafetyAnalysisAttr>(S, D, Attr); break; - case AttributeList::AT_NoSanitizeThread: - handleSimpleAttribute<NoSanitizeThreadAttr>(S, D, Attr); - break; - case AttributeList::AT_NoSanitizeMemory: - handleSimpleAttribute<NoSanitizeMemoryAttr>(S, D, Attr); - break; case AttributeList::AT_GuardedBy: handleGuardedByAttr(S, D, Attr); break; |