mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
The new option `-sanitize-recover=` takes a list of sanitizers that recovery instrumentation should be enabled for. Currently we only support it for Address Sanitizer. If the option is not specified then the generated instrumentation does not allow error recovery. This option mirrors the `-fsanitize-recover=` option of Clang. We don't enable recoverable instrumentation by default because it may lead to code size blow up (control flow has to be resumable). The motivation behind this change is that today, setting `ASAN_OPTIONS=halt_on_error=0` at runtime doesn't always work. If you compile without the `-sanitize-recover=address` option (equivalent to the current behavior of the swift compiler) then the generated instrumentation doesn't allow for error recovery. What this means is that if you set `ASAN_OPTIONS=halt_on_error=0` at runtime and if an ASan issue is caught via instrumentation then the process will always halt regardless of how `halt_on_error` is set. However, if ASan catches an issue via one of its interceptors (e.g. memcpy) then `the halt_on_error` runtime option is respected. With `-sanitize-recover=address` the generated instrumentation allows for error recovery which means that the `halt_on_error` runtime option is also respected when the ASan issue is caught by instrumentation. ASan's default for `halt_on_error` is true which means this issue only effects people who choose to not use the default behavior. rdar://problem/56346688
54 lines
2.1 KiB
C++
54 lines
2.1 KiB
C++
//===--- SanitizerOptions.h - Helpers related to sanitizers -----*- C++ -*-===//
|
|
//
|
|
// This source file is part of the Swift.org open source project
|
|
//
|
|
// Copyright (c) 2014 - 2017 Apple Inc. and the Swift project authors
|
|
// Licensed under Apache License v2.0 with Runtime Library Exception
|
|
//
|
|
// See https://swift.org/LICENSE.txt for license information
|
|
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef SWIFT_OPTIONS_SANITIZER_OPTIONS_H
|
|
#define SWIFT_OPTIONS_SANITIZER_OPTIONS_H
|
|
|
|
#include "swift/Basic/Sanitizers.h"
|
|
#include "swift/Basic/OptionSet.h"
|
|
#include "llvm/ADT/Triple.h"
|
|
#include "llvm/Option/Arg.h"
|
|
#include "llvm/Option/ArgList.h"
|
|
// FIXME: This include is just for llvm::SanitizerCoverageOptions. We should
|
|
// split the header upstream so we don't include so much.
|
|
#include "llvm/Transforms/Instrumentation.h"
|
|
|
|
namespace swift {
|
|
class DiagnosticEngine;
|
|
|
|
/// Parses a -sanitize= argument's values.
|
|
///
|
|
/// \param Diag If non null, the argument is used to diagnose invalid values.
|
|
/// \param sanitizerRuntimeLibExists Function which checks for existence of a
|
|
// sanitizer dylib with a given name.
|
|
/// \return Returns a SanitizerKind.
|
|
OptionSet<SanitizerKind> parseSanitizerArgValues(
|
|
const llvm::opt::ArgList &Args, const llvm::opt::Arg *A,
|
|
const llvm::Triple &Triple, DiagnosticEngine &Diag,
|
|
llvm::function_ref<bool(llvm::StringRef, bool)> sanitizerRuntimeLibExists);
|
|
|
|
OptionSet<SanitizerKind> parseSanitizerRecoverArgValues(
|
|
const llvm::opt::Arg *A, const OptionSet<SanitizerKind> &enabledSanitizers,
|
|
DiagnosticEngine &Diags, bool emitWarnings);
|
|
|
|
/// Parses a -sanitize-coverage= argument's value.
|
|
llvm::SanitizerCoverageOptions parseSanitizerCoverageArgValue(
|
|
const llvm::opt::Arg *A,
|
|
const llvm::Triple &Triple,
|
|
DiagnosticEngine &Diag,
|
|
OptionSet<SanitizerKind> sanitizers);
|
|
|
|
/// Returns the active sanitizers as a comma-separated list.
|
|
std::string getSanitizerList(const OptionSet<SanitizerKind> &Set);
|
|
}
|
|
#endif // SWIFT_OPTIONS_SANITIZER_OPTIONS_H
|