r269309 - [ubsan] Add -fsanitize-undefined-strip-path-components=N
Filipe Cabecinhas via cfe-commits
cfe-commits at lists.llvm.org
Fri May 13 00:01:07 PDT 2016
> On 13 May 2016, at 07:03, Sean Silva <chisophugis at gmail.com> wrote:
>
>
>
> On Thu, May 12, 2016 at 9:51 AM, Filipe Cabecinhas via cfe-commits <cfe-commits at lists.llvm.org> wrote:
> Author: filcab
> Date: Thu May 12 11:51:36 2016
> New Revision: 269309
>
> URL: http://llvm.org/viewvc/llvm-project?rev=269309&view=rev
> Log:
> [ubsan] Add -fsanitize-undefined-strip-path-components=N
>
> Summary:
> This option allows the user to control how much of the file name is
> emitted by UBSan. Tuning this option allows one to save space in the
> resulting binary, which is helpful for restricted execution
> environments.
>
> With a positive N, UBSan skips the first N path components.
> With a negative N, UBSan only keeps the last N path components.
>
> Reviewers: rsmith
>
> Subscribers: cfe-commits
>
> Differential Revision: http://reviews.llvm.org/D19666
>
> Added:
> cfe/trunk/test/CodeGen/ubsan-strip-path-components.cpp
> cfe/trunk/test/Driver/fubsan-strip-path-components.cpp
> Modified:
> cfe/trunk/docs/UndefinedBehaviorSanitizer.rst
> cfe/trunk/include/clang/Driver/Options.td
> cfe/trunk/include/clang/Frontend/CodeGenOptions.def
> cfe/trunk/lib/CodeGen/CGExpr.cpp
> cfe/trunk/lib/Driver/Tools.cpp
> cfe/trunk/lib/Frontend/CompilerInvocation.cpp
>
> Modified: cfe/trunk/docs/UndefinedBehaviorSanitizer.rst
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/docs/UndefinedBehaviorSanitizer.rst?rev=269309&r1=269308&r2=269309&view=diff
> ==============================================================================
> --- cfe/trunk/docs/UndefinedBehaviorSanitizer.rst (original)
> +++ cfe/trunk/docs/UndefinedBehaviorSanitizer.rst Thu May 12 11:51:36 2016
> @@ -228,6 +228,26 @@ UndefinedBehaviorSanitizer is available
> 3.3. The test suite is integrated into the CMake build and can be run with
> ``check-ubsan`` command.
>
> +Additional Configuration
> +========================
> +
> +UndefinedBehaviorSanitizer adds static check data for each check unless it is
> +in trap mode. This check data includes the full file name. The option
> +``-fsanitize-undefined-strip-path-components=N`` can be used to trim this
> +information. If ``N`` is positive, file information emitted by
> +UndefinedBehaviorSanitizer will drop the first ``N`` components from the file
> +path. If ``N`` is negative, the last ``N`` components will be kept.
> +
> +Example
> +-------
> +
> +For a file called ``/code/library/file.cpp``, here is what would be emitted:
> +* Default (No flag, or ``-fsanitize-undefined-strip-path-components=0``): ``/code/library/file.cpp``
> +* ``-fsanitize-undefined-strip-path-components=1``: ``code/library/file.cpp``
> +* ``-fsanitize-undefined-strip-path-components=2``: ``library/file.cpp``
> +* ``-fsanitize-undefined-strip-path-components=-1``: ``file.cpp``
> +* ``-fsanitize-undefined-strip-path-components=-2``: ``library/file.cpp``
>
> How are drive letters handled?
>
> -- Sean Silva
Same way as Path iterator:
/// / => /
/// /foo => /,foo
/// foo/ => foo,.
/// /foo/bar => /,foo,bar
/// ../ => ..,.
/// C:\foo\bar => C:,/,foo,bar
Filipe
>
> +
> More Information
> ================
>
>
> Modified: cfe/trunk/include/clang/Driver/Options.td
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/Options.td?rev=269309&r1=269308&r2=269309&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Driver/Options.td (original)
> +++ cfe/trunk/include/clang/Driver/Options.td Thu May 12 11:51:36 2016
> @@ -677,6 +677,10 @@ def fsanitize_stats : Flag<["-"], "fsani
> def fno_sanitize_stats : Flag<["-"], "fno-sanitize-stats">,
> Group<f_clang_Group>, Flags<[CC1Option]>,
> HelpText<"Disable sanitizer statistics gathering.">;
> +def fsanitize_undefined_strip_path_components_EQ : Joined<["-"], "fsanitize-undefined-strip-path-components=">,
> + Group<f_clang_Group>, Flags<[CC1Option]>, MetaVarName<"<number>">,
> + HelpText<"Strip (or keep only, if negative) a given number of path components "
> + "when emitting check metadata.">;
> def funsafe_math_optimizations : Flag<["-"], "funsafe-math-optimizations">,
> Group<f_Group>;
> def fno_unsafe_math_optimizations : Flag<["-"], "fno-unsafe-math-optimizations">,
>
> Modified: cfe/trunk/include/clang/Frontend/CodeGenOptions.def
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Frontend/CodeGenOptions.def?rev=269309&r1=269308&r2=269309&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Frontend/CodeGenOptions.def (original)
> +++ cfe/trunk/include/clang/Frontend/CodeGenOptions.def Thu May 12 11:51:36 2016
> @@ -225,6 +225,10 @@ ENUM_CODEGENOPT(VecLib, VectorLibrary, 1
> /// The default TLS model to use.
> ENUM_CODEGENOPT(DefaultTLSModel, TLSModel, 2, GeneralDynamicTLSModel)
>
> +/// Number of path components to strip when emitting checks. (0 == full
> +/// filename)
> +VALUE_CODEGENOPT(EmitCheckPathComponentsToStrip, 32, 0)
> +
> #undef CODEGENOPT
> #undef ENUM_CODEGENOPT
> #undef VALUE_CODEGENOPT
>
> Modified: cfe/trunk/lib/CodeGen/CGExpr.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGExpr.cpp?rev=269309&r1=269308&r2=269309&view=diff
> ==============================================================================
> --- cfe/trunk/lib/CodeGen/CGExpr.cpp (original)
> +++ cfe/trunk/lib/CodeGen/CGExpr.cpp Thu May 12 11:51:36 2016
> @@ -32,6 +32,7 @@
> #include "llvm/IR/MDBuilder.h"
> #include "llvm/Support/ConvertUTF.h"
> #include "llvm/Support/MathExtras.h"
> +#include "llvm/Support/Path.h"
> #include "llvm/Transforms/Utils/SanitizerStats.h"
>
> using namespace clang;
> @@ -2367,7 +2368,33 @@ llvm::Constant *CodeGenFunction::EmitChe
>
> PresumedLoc PLoc = getContext().getSourceManager().getPresumedLoc(Loc);
> if (PLoc.isValid()) {
> - auto FilenameGV = CGM.GetAddrOfConstantCString(PLoc.getFilename(), ".src");
> + StringRef FilenameString = PLoc.getFilename();
> +
> + int PathComponentsToStrip =
> + CGM.getCodeGenOpts().EmitCheckPathComponentsToStrip;
> + if (PathComponentsToStrip < 0) {
> + assert(PathComponentsToStrip != INT_MIN);
> + int PathComponentsToKeep = -PathComponentsToStrip;
> + auto I = llvm::sys::path::rbegin(FilenameString);
> + auto E = llvm::sys::path::rend(FilenameString);
> + while (I != E && --PathComponentsToKeep)
> + ++I;
> +
> + FilenameString = FilenameString.substr(I - E);
> + } else if (PathComponentsToStrip > 0) {
> + auto I = llvm::sys::path::begin(FilenameString);
> + auto E = llvm::sys::path::end(FilenameString);
> + while (I != E && PathComponentsToStrip--)
> + ++I;
> +
> + if (I != E)
> + FilenameString =
> + FilenameString.substr(I - llvm::sys::path::begin(FilenameString));
> + else
> + FilenameString = llvm::sys::path::filename(FilenameString);
> + }
> +
> + auto FilenameGV = CGM.GetAddrOfConstantCString(FilenameString, ".src");
> CGM.getSanitizerMetadata()->disableSanitizerForGlobal(
> cast<llvm::GlobalVariable>(FilenameGV.getPointer()));
> Filename = FilenameGV.getPointer();
>
> Modified: cfe/trunk/lib/Driver/Tools.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Tools.cpp?rev=269309&r1=269308&r2=269309&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Driver/Tools.cpp (original)
> +++ cfe/trunk/lib/Driver/Tools.cpp Thu May 12 11:51:36 2016
> @@ -5607,6 +5607,10 @@ void Clang::ConstructJob(Compilation &C,
> if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
> A->render(Args, CmdArgs);
>
> + if (Arg *A = Args.getLastArg(
> + options::OPT_fsanitize_undefined_strip_path_components_EQ))
> + A->render(Args, CmdArgs);
> +
> // -fdollars-in-identifiers default varies depending on platform and
> // language; only pass if specified.
> if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
>
> Modified: cfe/trunk/lib/Frontend/CompilerInvocation.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/CompilerInvocation.cpp?rev=269309&r1=269308&r2=269309&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Frontend/CompilerInvocation.cpp (original)
> +++ cfe/trunk/lib/Frontend/CompilerInvocation.cpp Thu May 12 11:51:36 2016
> @@ -823,6 +823,9 @@ static bool ParseCodeGenArgs(CodeGenOpti
>
> Opts.Backchain = Args.hasArg(OPT_mbackchain);
>
> + Opts.EmitCheckPathComponentsToStrip = getLastArgIntValue(
> + Args, OPT_fsanitize_undefined_strip_path_components_EQ, 0, Diags);
> +
> return Success;
> }
>
>
> Added: cfe/trunk/test/CodeGen/ubsan-strip-path-components.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/ubsan-strip-path-components.cpp?rev=269309&view=auto
> ==============================================================================
> --- cfe/trunk/test/CodeGen/ubsan-strip-path-components.cpp (added)
> +++ cfe/trunk/test/CodeGen/ubsan-strip-path-components.cpp Thu May 12 11:51:36 2016
> @@ -0,0 +1,29 @@
> +// RUN: %clang_cc1 %s -triple=x86_64-linux-gnu -emit-llvm -fsanitize=unreachable -o - | FileCheck %s -check-prefix=REGULAR -check-prefix=CHECK
> +// RUN: %clang_cc1 %s -triple=x86_64-linux-gnu -emit-llvm -fsanitize=unreachable -o - -fsanitize-undefined-strip-path-components=0 | FileCheck %s -check-prefix=REGULAR -check-prefix=CHECK
> +// RUN: %clang_cc1 %s -triple=x86_64-linux-gnu -emit-llvm -fsanitize=unreachable -o - -fsanitize-undefined-strip-path-components=2 | FileCheck %s -check-prefix=REMOVE-FIRST-TWO -check-prefix=CHECK
> +
> +// Try to strip too much:
> +// RUN: %clang_cc1 %s -triple=x86_64-linux-gnu -emit-llvm -fsanitize=unreachable -o - -fsanitize-undefined-strip-path-components=-99999 | FileCheck %s -check-prefix=REGULAR
> +// RUN: %clang_cc1 %s -triple=x86_64-linux-gnu -emit-llvm -fsanitize=unreachable -o - -fsanitize-undefined-strip-path-components=99999 | FileCheck %s -check-prefix=LAST-ONLY
> +
> +// Check stripping from the file name
> +// RUN: %clang_cc1 %s -triple=x86_64-linux-gnu -emit-llvm -fsanitize=unreachable -o - -fsanitize-undefined-strip-path-components=-2 | FileCheck %s -check-prefix=LAST-TWO
> +// RUN: %clang_cc1 %s -triple=x86_64-linux-gnu -emit-llvm -fsanitize=unreachable -o - -fsanitize-undefined-strip-path-components=-1 | FileCheck %s -check-prefix=LAST-ONLY
> +
> +// REGULAR: @[[SRC:[0-9.a-zA-Z_]+]] = private unnamed_addr constant [{{.*}} x i8] c"{{.*test(.|\\5C)CodeGen(.|\\5C)ubsan-strip-path-components\.cpp}}\00", align 1
> +
> +// First path component: "/" or "$drive_letter:", then a name, or '\5C' on Windows
> +// REMOVE-FIRST-TWO: @[[STR:[0-9.a-zA-Z_]+]] = private unnamed_addr constant [{{.*}} x i8] c"{{(.:|/)([^\\/]*(/|\\5C))}}[[REST:.*ubsan-strip-path-components\.cpp]]\00", align 1
> +// REMOVE-FIRST-TWO: @[[SRC:[0-9.a-zA-Z_]+]] = private unnamed_addr constant [{{.*}} x i8] c"[[REST]]\00", align 1
> +
> +// LAST-TWO: @[[SRC:[0-9.a-zA-Z_]+]] = private unnamed_addr constant [{{.*}} x i8] c"CodeGen{{/|\\5C}}ubsan-strip-path-components.cpp\00", align 1
> +// LAST-ONLY: @[[SRC:[0-9.a-zA-Z_]+]] = private unnamed_addr constant [{{.*}} x i8] c"ubsan-strip-path-components.cpp\00", align 1
> +
> +// CHECK: @[[STATIC_DATA:[0-9.a-zA-Z_]+]] = private unnamed_addr global { { [{{.*}} x i8]*, i32, i32 } } { { [{{.*}} x i8]*, i32, i32 } { [{{.*}} x i8]* @[[SRC]], i32 [[@LINE+6]], i32 3 } }
> +void g(const char *);
> +void f() {
> + // CHECK-LABEL: @_Z1fv(
> + g(__FILE__);
> + // CHECK: call void @__ubsan_handle_builtin_unreachable(i8* bitcast ({ { [{{.*}} x i8]*, i32, i32 } }* @[[STATIC_DATA]] to i8*)) {{.*}}, !nosanitize
> + __builtin_unreachable();
> +}
>
> Added: cfe/trunk/test/Driver/fubsan-strip-path-components.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/fubsan-strip-path-components.cpp?rev=269309&view=auto
> ==============================================================================
> --- cfe/trunk/test/Driver/fubsan-strip-path-components.cpp (added)
> +++ cfe/trunk/test/Driver/fubsan-strip-path-components.cpp Thu May 12 11:51:36 2016
> @@ -0,0 +1,2 @@
> +// RUN: %clang %s -### -o %t.o -fsanitize-undefined-strip-path-components=42 2>&1 | FileCheck %s
> +// CHECK: "-fsanitize-undefined-strip-path-components=42"
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>
More information about the cfe-commits
mailing list