r269309 - [ubsan] Add -fsanitize-undefined-strip-path-components=N

Sean Silva via cfe-commits cfe-commits at lists.llvm.org
Mon May 16 16:19:10 PDT 2016


On Fri, May 13, 2016 at 12:01 AM, Filipe Cabecinhas <scee at filcab.net> wrote:

>
> > 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
>
>
Please mention this in the user-facing documentation.

-- Sean Silva



>   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
> >
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20160516/68b31e4f/attachment-0001.html>


More information about the cfe-commits mailing list