[clang] [sanitizer] Refactor -f(no-)?sanitize-recover parsing (PR #119819)
Thurston Dang via cfe-commits
cfe-commits at lists.llvm.org
Tue Dec 17 16:04:03 PST 2024
https://github.com/thurstond updated https://github.com/llvm/llvm-project/pull/119819
>From 9afe71655814ead9bd29acf5ebd515253777081d Mon Sep 17 00:00:00 2001
From: Thurston Dang <thurston at google.com>
Date: Fri, 13 Dec 2024 05:14:56 +0000
Subject: [PATCH 1/7] [sanitizer] Refactor -f(no-)?sanitize-recover parsing
This moves the functionality into a generic parseSanitizerArgs
function, and then uses it for parsing both -f(no-)?sanitize-recover
and -f(no-)?sanitize-trap.
Note: for backwards compatibility, we compute the sanitizer mask as:
Default + AlwaysIn + Arguments - AlwaysOut
instead of:
Default + Arguments + AlwaysIn - AlwaysOut
---
clang/lib/Driver/SanitizerArgs.cpp | 120 ++++++++++++++---------------
1 file changed, 56 insertions(+), 64 deletions(-)
diff --git a/clang/lib/Driver/SanitizerArgs.cpp b/clang/lib/Driver/SanitizerArgs.cpp
index 355dea5fad80bf..3e881fdf03ed7d 100644
--- a/clang/lib/Driver/SanitizerArgs.cpp
+++ b/clang/lib/Driver/SanitizerArgs.cpp
@@ -247,48 +247,72 @@ static SanitizerMask setGroupBits(SanitizerMask Kinds) {
return Kinds;
}
-// Computes the sanitizer mask based on the default plus opt-in (if supported)
-// minus opt-out.
+// Computes the sanitizer mask as:
+// Default + AlwaysIn + Arguments - AlwaysOut
+// with arguments parsed from left to right.
+//
+// Error messages are optionally printed if the AlwaysIn or AlwaysOut
+// invariants are violated.
static SanitizerMask
parseSanitizeArgs(const Driver &D, const llvm::opt::ArgList &Args,
- bool DiagnoseErrors, SanitizerMask Supported,
- SanitizerMask Default, int OptInID, int OptOutID) {
- SanitizerMask Remove; // During the loop below, the accumulated set of
- // sanitizers disabled by the current sanitizer
- // argument or any argument after it.
- SanitizerMask Kinds;
- SanitizerMask SupportedWithGroups = setGroupBits(Supported);
-
- for (const llvm::opt::Arg *Arg : llvm::reverse(Args)) {
+ bool DiagnoseErrors, SanitizerMask Default,
+ SanitizerMask AlwaysIn, SanitizerMask AlwaysOut, int OptInID,
+ int OptOutID) {
+
+ SanitizerMask Output = Default | AlwaysIn;
+ // Keep track of which violations we have already reported, to avoid
+ // duplicate error messages.
+ SanitizerMask DiagnosedAlwaysInViolations;
+ SanitizerMask DiagnosedAlwaysOutViolations;
+ for (const auto *Arg : Args) {
if (Arg->getOption().matches(OptInID)) {
- Arg->claim();
- SanitizerMask Add = parseArgValues(D, Arg, true);
- Add &= ~Remove;
- SanitizerMask InvalidValues = Add & ~SupportedWithGroups;
- if (InvalidValues && DiagnoseErrors) {
- SanitizerSet S;
- S.Mask = InvalidValues;
- D.Diag(diag::err_drv_unsupported_option_argument)
- << Arg->getSpelling() << toString(S);
+ SanitizerMask Add = parseArgValues(D, Arg, DiagnoseErrors);
+ // Report error if user explicitly tries to opt-in to an always-out
+ // sanitizer.
+ if (SanitizerMask KindsToDiagnose =
+ Add & AlwaysOut & ~DiagnosedAlwaysOutViolations) {
+ if (DiagnoseErrors) {
+ SanitizerSet SetToDiagnose;
+ SetToDiagnose.Mask |= KindsToDiagnose;
+ D.Diag(diag::err_drv_unsupported_option_argument)
+ << Arg->getSpelling() << toString(SetToDiagnose);
+ DiagnosedAlwaysOutViolations |= KindsToDiagnose;
+ }
}
- Kinds |= expandSanitizerGroups(Add) & ~Remove;
+ Output |= expandSanitizerGroups(Add);
+ Arg->claim();
} else if (Arg->getOption().matches(OptOutID)) {
+ SanitizerMask Remove = parseArgValues(D, Arg, DiagnoseErrors);
+ // Report error if user explicitly tries to opt-out of an always-in
+ // sanitizer.
+ if (SanitizerMask KindsToDiagnose =
+ Remove & AlwaysIn & ~DiagnosedAlwaysInViolations) {
+ if (DiagnoseErrors) {
+ SanitizerSet SetToDiagnose;
+ SetToDiagnose.Mask |= KindsToDiagnose;
+ D.Diag(diag::err_drv_unsupported_option_argument)
+ << Arg->getSpelling() << toString(SetToDiagnose);
+ DiagnosedAlwaysInViolations |= KindsToDiagnose;
+ }
+ }
+ Output &= ~expandSanitizerGroups(Remove);
Arg->claim();
- Remove |= expandSanitizerGroups(parseArgValues(D, Arg, DiagnoseErrors));
}
}
- // Apply default behavior.
- Kinds |= Default & ~Remove;
+ Output &= ~AlwaysOut;
- return Kinds;
+ return Output;
}
static SanitizerMask parseSanitizeTrapArgs(const Driver &D,
const llvm::opt::ArgList &Args,
bool DiagnoseErrors) {
- return parseSanitizeArgs(D, Args, DiagnoseErrors, TrappingSupported,
- TrappingDefault, options::OPT_fsanitize_trap_EQ,
+ SanitizerMask AlwaysTrap; // Empty
+ SanitizerMask NeverTrap = ~(setGroupBits(TrappingSupported));
+
+ return parseSanitizeArgs(D, Args, DiagnoseErrors, TrappingDefault, AlwaysTrap,
+ NeverTrap, options::OPT_fsanitize_trap_EQ,
options::OPT_fno_sanitize_trap_EQ);
}
@@ -652,44 +676,12 @@ SanitizerArgs::SanitizerArgs(const ToolChain &TC,
// default in ASan?
// Parse -f(no-)?sanitize-recover flags.
- SanitizerMask RecoverableKinds = RecoverableByDefault | AlwaysRecoverable;
- SanitizerMask DiagnosedUnrecoverableKinds;
- SanitizerMask DiagnosedAlwaysRecoverableKinds;
- for (const auto *Arg : Args) {
- if (Arg->getOption().matches(options::OPT_fsanitize_recover_EQ)) {
- SanitizerMask Add = parseArgValues(D, Arg, DiagnoseErrors);
- // Report error if user explicitly tries to recover from unrecoverable
- // sanitizer.
- if (SanitizerMask KindsToDiagnose =
- Add & Unrecoverable & ~DiagnosedUnrecoverableKinds) {
- SanitizerSet SetToDiagnose;
- SetToDiagnose.Mask |= KindsToDiagnose;
- if (DiagnoseErrors)
- D.Diag(diag::err_drv_unsupported_option_argument)
- << Arg->getSpelling() << toString(SetToDiagnose);
- DiagnosedUnrecoverableKinds |= KindsToDiagnose;
- }
- RecoverableKinds |= expandSanitizerGroups(Add);
- Arg->claim();
- } else if (Arg->getOption().matches(options::OPT_fno_sanitize_recover_EQ)) {
- SanitizerMask Remove = parseArgValues(D, Arg, DiagnoseErrors);
- // Report error if user explicitly tries to disable recovery from
- // always recoverable sanitizer.
- if (SanitizerMask KindsToDiagnose =
- Remove & AlwaysRecoverable & ~DiagnosedAlwaysRecoverableKinds) {
- SanitizerSet SetToDiagnose;
- SetToDiagnose.Mask |= KindsToDiagnose;
- if (DiagnoseErrors)
- D.Diag(diag::err_drv_unsupported_option_argument)
- << Arg->getSpelling() << toString(SetToDiagnose);
- DiagnosedAlwaysRecoverableKinds |= KindsToDiagnose;
- }
- RecoverableKinds &= ~expandSanitizerGroups(Remove);
- Arg->claim();
- }
- }
+ SanitizerMask RecoverableKinds = parseSanitizeArgs(
+ D, Args, DiagnoseErrors, RecoverableByDefault, AlwaysRecoverable,
+ Unrecoverable, options::OPT_fsanitize_recover_EQ,
+ options::OPT_fno_sanitize_recover_EQ);
+
RecoverableKinds &= Kinds;
- RecoverableKinds &= ~Unrecoverable;
TrappingKinds &= Kinds;
RecoverableKinds &= ~TrappingKinds;
>From c362e66e1045bd1054363655c55aa53482dc5aee Mon Sep 17 00:00:00 2001
From: Thurston Dang <thurston at google.com>
Date: Tue, 17 Dec 2024 18:41:33 +0000
Subject: [PATCH 2/7] Address feedback: add assert and enforce AlwaysIn
---
clang/lib/Driver/SanitizerArgs.cpp | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/clang/lib/Driver/SanitizerArgs.cpp b/clang/lib/Driver/SanitizerArgs.cpp
index 3e881fdf03ed7d..fd7e49b396a551 100644
--- a/clang/lib/Driver/SanitizerArgs.cpp
+++ b/clang/lib/Driver/SanitizerArgs.cpp
@@ -258,8 +258,10 @@ parseSanitizeArgs(const Driver &D, const llvm::opt::ArgList &Args,
bool DiagnoseErrors, SanitizerMask Default,
SanitizerMask AlwaysIn, SanitizerMask AlwaysOut, int OptInID,
int OptOutID) {
+ assert(!(AlwaysIn & AlwaysOut) &&
+ "parseSanitizeArgs called with contradictory in/out requirements");
- SanitizerMask Output = Default | AlwaysIn;
+ SanitizerMask Output = Default;
// Keep track of which violations we have already reported, to avoid
// duplicate error messages.
SanitizerMask DiagnosedAlwaysInViolations;
@@ -300,6 +302,7 @@ parseSanitizeArgs(const Driver &D, const llvm::opt::ArgList &Args,
}
}
+ Output |= AlwaysIn;
Output &= ~AlwaysOut;
return Output;
>From 6a4a8ce693b3b9d019eb5adaeff4b42e7eefb905 Mon Sep 17 00:00:00 2001
From: Thurston Dang <thurston at google.com>
Date: Tue, 17 Dec 2024 22:55:22 +0000
Subject: [PATCH 3/7] Add 'AlwaysOutAdvisoryOnly' for backwards compatibility.
Fixes Clang.Driver/fsanitize.c error reported by
https://buildkite.com/llvm-project/github-pull-requests/builds/129870
---
clang/lib/Driver/SanitizerArgs.cpp | 17 ++++++++++++-----
1 file changed, 12 insertions(+), 5 deletions(-)
diff --git a/clang/lib/Driver/SanitizerArgs.cpp b/clang/lib/Driver/SanitizerArgs.cpp
index fd7e49b396a551..f317cad00b9faa 100644
--- a/clang/lib/Driver/SanitizerArgs.cpp
+++ b/clang/lib/Driver/SanitizerArgs.cpp
@@ -248,16 +248,18 @@ static SanitizerMask setGroupBits(SanitizerMask Kinds) {
}
// Computes the sanitizer mask as:
-// Default + AlwaysIn + Arguments - AlwaysOut
+// Default + Arguments (in or out) + AlwaysIn - AlwaysOut
// with arguments parsed from left to right.
//
+// AlwaysOut is not enforced if AlwaysOutAdvisoryOnly is enabled.
+//
// Error messages are optionally printed if the AlwaysIn or AlwaysOut
// invariants are violated.
static SanitizerMask
parseSanitizeArgs(const Driver &D, const llvm::opt::ArgList &Args,
bool DiagnoseErrors, SanitizerMask Default,
SanitizerMask AlwaysIn, SanitizerMask AlwaysOut, int OptInID,
- int OptOutID) {
+ int OptOutID, bool AlwaysOutAdvisoryOnly) {
assert(!(AlwaysIn & AlwaysOut) &&
"parseSanitizeArgs called with contradictory in/out requirements");
@@ -303,7 +305,8 @@ parseSanitizeArgs(const Driver &D, const llvm::opt::ArgList &Args,
}
Output |= AlwaysIn;
- Output &= ~AlwaysOut;
+ if (!AlwaysOutAdvisoryOnly)
+ Output &= ~AlwaysOut;
return Output;
}
@@ -314,9 +317,13 @@ static SanitizerMask parseSanitizeTrapArgs(const Driver &D,
SanitizerMask AlwaysTrap; // Empty
SanitizerMask NeverTrap = ~(setGroupBits(TrappingSupported));
+ // AlwaysOutAdvisoryOnly = true is needed to maintain the behavior of
+ // '-fsanitize=undefined -fsanitize-trap=undefined'
+ // (clang/test/Driver/fsanitize.c ), which is that vptr is not enabled at all
+ // (not even in recover mode) in order to avoid the need for a ubsan runtime.
return parseSanitizeArgs(D, Args, DiagnoseErrors, TrappingDefault, AlwaysTrap,
NeverTrap, options::OPT_fsanitize_trap_EQ,
- options::OPT_fno_sanitize_trap_EQ);
+ options::OPT_fno_sanitize_trap_EQ, true);
}
bool SanitizerArgs::needsFuzzerInterceptors() const {
@@ -682,7 +689,7 @@ SanitizerArgs::SanitizerArgs(const ToolChain &TC,
SanitizerMask RecoverableKinds = parseSanitizeArgs(
D, Args, DiagnoseErrors, RecoverableByDefault, AlwaysRecoverable,
Unrecoverable, options::OPT_fsanitize_recover_EQ,
- options::OPT_fno_sanitize_recover_EQ);
+ options::OPT_fno_sanitize_recover_EQ, false);
RecoverableKinds &= Kinds;
>From c48088726f485a51280e738507cfe9a9d06cb65e Mon Sep 17 00:00:00 2001
From: Thurston Dang <thurston at google.com>
Date: Tue, 17 Dec 2024 22:58:24 +0000
Subject: [PATCH 4/7] Formatting
---
clang/lib/Driver/SanitizerArgs.cpp | 22 +++++++++++++++-------
1 file changed, 15 insertions(+), 7 deletions(-)
diff --git a/clang/lib/Driver/SanitizerArgs.cpp b/clang/lib/Driver/SanitizerArgs.cpp
index f317cad00b9faa..87e2c2f8923351 100644
--- a/clang/lib/Driver/SanitizerArgs.cpp
+++ b/clang/lib/Driver/SanitizerArgs.cpp
@@ -306,7 +306,7 @@ parseSanitizeArgs(const Driver &D, const llvm::opt::ArgList &Args,
Output |= AlwaysIn;
if (!AlwaysOutAdvisoryOnly)
- Output &= ~AlwaysOut;
+ Output &= ~AlwaysOut;
return Output;
}
@@ -321,9 +321,13 @@ static SanitizerMask parseSanitizeTrapArgs(const Driver &D,
// '-fsanitize=undefined -fsanitize-trap=undefined'
// (clang/test/Driver/fsanitize.c ), which is that vptr is not enabled at all
// (not even in recover mode) in order to avoid the need for a ubsan runtime.
- return parseSanitizeArgs(D, Args, DiagnoseErrors, TrappingDefault, AlwaysTrap,
- NeverTrap, options::OPT_fsanitize_trap_EQ,
- options::OPT_fno_sanitize_trap_EQ, true);
+ return parseSanitizeArgs(D, Args, DiagnoseErrors,
+ /* Default */ TrappingDefault,
+ /* AlwaysIn */ AlwaysTrap,
+ /* AlwaysOut */ NeverTrap,
+ /* OptInID */ options::OPT_fsanitize_trap_EQ,
+ /* OptOutID */ options::OPT_fno_sanitize_trap_EQ,
+ /* AlwaysOutAdvisoryOnly */ true);
}
bool SanitizerArgs::needsFuzzerInterceptors() const {
@@ -687,9 +691,13 @@ SanitizerArgs::SanitizerArgs(const ToolChain &TC,
// Parse -f(no-)?sanitize-recover flags.
SanitizerMask RecoverableKinds = parseSanitizeArgs(
- D, Args, DiagnoseErrors, RecoverableByDefault, AlwaysRecoverable,
- Unrecoverable, options::OPT_fsanitize_recover_EQ,
- options::OPT_fno_sanitize_recover_EQ, false);
+ D, Args, DiagnoseErrors,
+ /* Default */ RecoverableByDefault,
+ /* AlwaysIn */ AlwaysRecoverable,
+ /* AlwaysOut */ Unrecoverable,
+ /* OptInID */ options::OPT_fsanitize_recover_EQ,
+ /* OptOutID */ options::OPT_fno_sanitize_recover_EQ,
+ /* AlwaysOutAdvisoryOnly */ false);
RecoverableKinds &= Kinds;
>From e24fbd34558bd257d54e7aed4a85c5ffefdd5be5 Mon Sep 17 00:00:00 2001
From: Thurston Dang <thurston at google.com>
Date: Tue, 17 Dec 2024 23:01:43 +0000
Subject: [PATCH 5/7] clang-format
---
clang/lib/Driver/SanitizerArgs.cpp | 16 ++++++++--------
1 file changed, 8 insertions(+), 8 deletions(-)
diff --git a/clang/lib/Driver/SanitizerArgs.cpp b/clang/lib/Driver/SanitizerArgs.cpp
index 87e2c2f8923351..39b1c4d97b302d 100644
--- a/clang/lib/Driver/SanitizerArgs.cpp
+++ b/clang/lib/Driver/SanitizerArgs.cpp
@@ -690,14 +690,14 @@ SanitizerArgs::SanitizerArgs(const ToolChain &TC,
// default in ASan?
// Parse -f(no-)?sanitize-recover flags.
- SanitizerMask RecoverableKinds = parseSanitizeArgs(
- D, Args, DiagnoseErrors,
- /* Default */ RecoverableByDefault,
- /* AlwaysIn */ AlwaysRecoverable,
- /* AlwaysOut */ Unrecoverable,
- /* OptInID */ options::OPT_fsanitize_recover_EQ,
- /* OptOutID */ options::OPT_fno_sanitize_recover_EQ,
- /* AlwaysOutAdvisoryOnly */ false);
+ SanitizerMask RecoverableKinds =
+ parseSanitizeArgs(D, Args, DiagnoseErrors,
+ /* Default */ RecoverableByDefault,
+ /* AlwaysIn */ AlwaysRecoverable,
+ /* AlwaysOut */ Unrecoverable,
+ /* OptInID */ options::OPT_fsanitize_recover_EQ,
+ /* OptOutID */ options::OPT_fno_sanitize_recover_EQ,
+ /* AlwaysOutAdvisoryOnly */ false);
RecoverableKinds &= Kinds;
>From 51973b75099d98a48e74bd9e2474e569c989932b Mon Sep 17 00:00:00 2001
From: Thurston Dang <thurston at google.com>
Date: Wed, 18 Dec 2024 00:02:23 +0000
Subject: [PATCH 6/7] Simplify per Vitaly's feedback
---
clang/lib/Driver/SanitizerArgs.cpp | 25 +++++++++----------------
1 file changed, 9 insertions(+), 16 deletions(-)
diff --git a/clang/lib/Driver/SanitizerArgs.cpp b/clang/lib/Driver/SanitizerArgs.cpp
index 39b1c4d97b302d..b4b0aa04f3e5ef 100644
--- a/clang/lib/Driver/SanitizerArgs.cpp
+++ b/clang/lib/Driver/SanitizerArgs.cpp
@@ -248,18 +248,16 @@ static SanitizerMask setGroupBits(SanitizerMask Kinds) {
}
// Computes the sanitizer mask as:
-// Default + Arguments (in or out) + AlwaysIn - AlwaysOut
+// Default + Arguments (in or out)
// with arguments parsed from left to right.
//
-// AlwaysOut is not enforced if AlwaysOutAdvisoryOnly is enabled.
-//
-// Error messages are optionally printed if the AlwaysIn or AlwaysOut
-// invariants are violated.
+// Error messages are printed if the AlwaysIn or AlwaysOut invariants are
+// violated, but the caller must enforce these invariants themselves.
static SanitizerMask
parseSanitizeArgs(const Driver &D, const llvm::opt::ArgList &Args,
bool DiagnoseErrors, SanitizerMask Default,
SanitizerMask AlwaysIn, SanitizerMask AlwaysOut, int OptInID,
- int OptOutID, bool AlwaysOutAdvisoryOnly) {
+ int OptOutID) {
assert(!(AlwaysIn & AlwaysOut) &&
"parseSanitizeArgs called with contradictory in/out requirements");
@@ -304,10 +302,6 @@ parseSanitizeArgs(const Driver &D, const llvm::opt::ArgList &Args,
}
}
- Output |= AlwaysIn;
- if (!AlwaysOutAdvisoryOnly)
- Output &= ~AlwaysOut;
-
return Output;
}
@@ -317,7 +311,7 @@ static SanitizerMask parseSanitizeTrapArgs(const Driver &D,
SanitizerMask AlwaysTrap; // Empty
SanitizerMask NeverTrap = ~(setGroupBits(TrappingSupported));
- // AlwaysOutAdvisoryOnly = true is needed to maintain the behavior of
+ // N.B. We do *not* enforce NeverTrap. This maintains the behavior of
// '-fsanitize=undefined -fsanitize-trap=undefined'
// (clang/test/Driver/fsanitize.c ), which is that vptr is not enabled at all
// (not even in recover mode) in order to avoid the need for a ubsan runtime.
@@ -326,8 +320,7 @@ static SanitizerMask parseSanitizeTrapArgs(const Driver &D,
/* AlwaysIn */ AlwaysTrap,
/* AlwaysOut */ NeverTrap,
/* OptInID */ options::OPT_fsanitize_trap_EQ,
- /* OptOutID */ options::OPT_fno_sanitize_trap_EQ,
- /* AlwaysOutAdvisoryOnly */ true);
+ /* OptOutID */ options::OPT_fno_sanitize_trap_EQ);
}
bool SanitizerArgs::needsFuzzerInterceptors() const {
@@ -696,9 +689,9 @@ SanitizerArgs::SanitizerArgs(const ToolChain &TC,
/* AlwaysIn */ AlwaysRecoverable,
/* AlwaysOut */ Unrecoverable,
/* OptInID */ options::OPT_fsanitize_recover_EQ,
- /* OptOutID */ options::OPT_fno_sanitize_recover_EQ,
- /* AlwaysOutAdvisoryOnly */ false);
-
+ /* OptOutID */ options::OPT_fno_sanitize_recover_EQ);
+ RecoverableKinds |= AlwaysRecoverable;
+ RecoverableKinds &= ~Unrecoverable;
RecoverableKinds &= Kinds;
TrappingKinds &= Kinds;
>From 686c25712b0b96c43d018986b9a3b257d9129b5c Mon Sep 17 00:00:00 2001
From: Thurston Dang <thurston at google.com>
Date: Wed, 18 Dec 2024 00:03:38 +0000
Subject: [PATCH 7/7] Remove comments
---
clang/lib/Driver/SanitizerArgs.cpp | 20 +++++++-------------
1 file changed, 7 insertions(+), 13 deletions(-)
diff --git a/clang/lib/Driver/SanitizerArgs.cpp b/clang/lib/Driver/SanitizerArgs.cpp
index b4b0aa04f3e5ef..0457d75b88405c 100644
--- a/clang/lib/Driver/SanitizerArgs.cpp
+++ b/clang/lib/Driver/SanitizerArgs.cpp
@@ -315,12 +315,9 @@ static SanitizerMask parseSanitizeTrapArgs(const Driver &D,
// '-fsanitize=undefined -fsanitize-trap=undefined'
// (clang/test/Driver/fsanitize.c ), which is that vptr is not enabled at all
// (not even in recover mode) in order to avoid the need for a ubsan runtime.
- return parseSanitizeArgs(D, Args, DiagnoseErrors,
- /* Default */ TrappingDefault,
- /* AlwaysIn */ AlwaysTrap,
- /* AlwaysOut */ NeverTrap,
- /* OptInID */ options::OPT_fsanitize_trap_EQ,
- /* OptOutID */ options::OPT_fno_sanitize_trap_EQ);
+ return parseSanitizeArgs(D, Args, DiagnoseErrors, TrappingDefault, AlwaysTrap,
+ NeverTrap, options::OPT_fsanitize_trap_EQ,
+ options::OPT_fno_sanitize_trap_EQ);
}
bool SanitizerArgs::needsFuzzerInterceptors() const {
@@ -683,13 +680,10 @@ SanitizerArgs::SanitizerArgs(const ToolChain &TC,
// default in ASan?
// Parse -f(no-)?sanitize-recover flags.
- SanitizerMask RecoverableKinds =
- parseSanitizeArgs(D, Args, DiagnoseErrors,
- /* Default */ RecoverableByDefault,
- /* AlwaysIn */ AlwaysRecoverable,
- /* AlwaysOut */ Unrecoverable,
- /* OptInID */ options::OPT_fsanitize_recover_EQ,
- /* OptOutID */ options::OPT_fno_sanitize_recover_EQ);
+ SanitizerMask RecoverableKinds = parseSanitizeArgs(
+ D, Args, DiagnoseErrors, RecoverableByDefault, AlwaysRecoverable,
+ Unrecoverable, options::OPT_fsanitize_recover_EQ,
+ options::OPT_fno_sanitize_recover_EQ);
RecoverableKinds |= AlwaysRecoverable;
RecoverableKinds &= ~Unrecoverable;
RecoverableKinds &= Kinds;
More information about the cfe-commits
mailing list