diff options
author | Alexey Samsonov <samsonov@google.com> | 2012-11-29 22:36:21 +0000 |
---|---|---|
committer | Alexey Samsonov <samsonov@google.com> | 2012-11-29 22:36:21 +0000 |
commit | 0e96becfb16ac05902917c9e71f43b023ac28ca5 (patch) | |
tree | 1bc9555e9d9452bdafc811571c58af1aeecdeac6 /clang/lib/Driver | |
parent | 50a24bd358b5a2f23ac9241cc8af3799e3d66523 (diff) | |
download | bcm5719-llvm-0e96becfb16ac05902917c9e71f43b023ac28ca5.tar.gz bcm5719-llvm-0e96becfb16ac05902917c9e71f43b023ac28ca5.zip |
This patch exposes to Clang users three more sanitizers are experimental features of ASan:
1) init-order sanitizer: initialization-order checker.
Status: usable, but may produce false positives w/o proper blacklisting.
2) use-after-return sanitizer
Status: implemented, but heavily understed.
Should be optional, as it significanlty slows program down.
3) use-after-scope sanitizer
Status: in progress.
llvm-svn: 168950
Diffstat (limited to 'clang/lib/Driver')
-rw-r--r-- | clang/lib/Driver/SanitizerArgs.h | 4 | ||||
-rw-r--r-- | clang/lib/Driver/Tools.cpp | 7 |
2 files changed, 9 insertions, 2 deletions
diff --git a/clang/lib/Driver/SanitizerArgs.h b/clang/lib/Driver/SanitizerArgs.h index 52a6c2ec4b1..af92fa070c3 100644 --- a/clang/lib/Driver/SanitizerArgs.h +++ b/clang/lib/Driver/SanitizerArgs.h @@ -28,7 +28,7 @@ class SanitizerArgs { #define SANITIZER(NAME, ID) ID = 1 << SO_##ID, #define SANITIZER_GROUP(NAME, ID, ALIAS) ID = ALIAS, #include "clang/Basic/Sanitizers.def" - NeedsAsanRt = Address, + NeedsAsanRt = AddressFull, NeedsTsanRt = Thread, NeedsUbsanRt = (Undefined & ~Bounds) | Integer }; @@ -44,7 +44,7 @@ class SanitizerArgs { bool needsUbsanRt() const { return Kind & NeedsUbsanRt; } bool sanitizesVptr() const { return Kind & Vptr; } - + void addArgs(const ArgList &Args, ArgStringList &CmdArgs) const { if (!Kind) return; diff --git a/clang/lib/Driver/Tools.cpp b/clang/lib/Driver/Tools.cpp index f9cb5eff533..f2c1a03caf3 100644 --- a/clang/lib/Driver/Tools.cpp +++ b/clang/lib/Driver/Tools.cpp @@ -1474,6 +1474,13 @@ SanitizerArgs::SanitizerArgs(const Driver &D, const ArgList &Args) { D.Diag(diag::err_drv_argument_not_allowed_with) << lastArgumentForKind(D, Args, NeedsAsan ? NeedsAsanRt : NeedsTsanRt) << lastArgumentForKind(D, Args, NeedsUbsan ? NeedsUbsanRt : NeedsTsanRt); + + // If -fsanitize contains extra features of ASan, it should also + // explicitly contain -fsanitize=address. + if (NeedsAsan && ((Kind & Address) == 0)) + D.Diag(diag::err_drv_argument_only_allowed_with) + << lastArgumentForKind(D, Args, NeedsAsanRt) + << "-fsanitize=address"; } /// If AddressSanitizer is enabled, add appropriate linker flags (Linux). |