On Mon, Jan 21, 2013 at 8:28 AM, Alexey Samsonov <[email protected]> wrote: > Hi rsmith, kcc, > > This patch changes the behavior of Clang driver for command line like > "clang++ -fsanitize=init-order a.cc": now it ignores -fsanitize=init-order > argument and > warns that it's unused w/o "-fsanitize=address" (instead of reporting an > error).
So if I understand correctly, the same warning is produced for all these variants: -fsanitize=init-order -fno-sanitize=address -fsanitize=init-order -fsanitize=address,init-order -fno-sanitize=address ? Could we specifically special case for situations like the last one? (or at least the last two) & make those silent (no warning) while possibly still producing an error for the first? Maybe that's difficult with our options parsing & not worth the hassle but I figured I'd check/ask. > As a rationale, consider the case when one wants to optionally build a large > project > with ASan, but disable instrumentation for specific files. Previously, adding > "-fno-sanitize=address" to a file-specific compile options would produce > an error when building the whole project with "-fsanitize=address,init-order", > so we'd have to go and fix all "-fno-sanitize=..." occurences to contain > all possible features of ASan. > > http://llvm-reviews.chandlerc.com/D315 > > Files: > lib/Driver/Tools.cpp > lib/Driver/SanitizerArgs.h > test/Driver/fsanitize.c > include/clang/Basic/DiagnosticGroups.td > include/clang/Basic/DiagnosticDriverKinds.td > > Index: lib/Driver/Tools.cpp > =================================================================== > --- lib/Driver/Tools.cpp > +++ lib/Driver/Tools.cpp > @@ -1475,10 +1475,10 @@ > > // 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 (((Kind & Address) == 0) && ((Kind & AddressFull) != 0)) > + D.Diag(diag::warn_drv_unused_sanitizer) > + << lastArgumentForKind(D, Args, AddressFull) > + << "-fsanitize=address"; > > // Parse -f(no-)sanitize-blacklist options. > if (Arg *BLArg = Args.getLastArg(options::OPT_fsanitize_blacklist, > Index: lib/Driver/SanitizerArgs.h > =================================================================== > --- lib/Driver/SanitizerArgs.h > +++ lib/Driver/SanitizerArgs.h > @@ -33,7 +33,7 @@ > #define SANITIZER(NAME, ID) ID = 1 << SO_##ID, > #define SANITIZER_GROUP(NAME, ID, ALIAS) ID = ALIAS, > #include "clang/Basic/Sanitizers.def" > - NeedsAsanRt = AddressFull, > + NeedsAsanRt = Address, > NeedsTsanRt = Thread, > NeedsMsanRt = Memory, > NeedsUbsanRt = (Undefined & ~Bounds) | Integer > Index: test/Driver/fsanitize.c > =================================================================== > --- test/Driver/fsanitize.c > +++ test/Driver/fsanitize.c > @@ -31,7 +31,10 @@ > // CHECK-ASAN-TSAN: '-faddress-sanitizer' not allowed with > '-fthread-sanitizer' > > // RUN: %clang -target x86_64-linux-gnu -fsanitize=init-order %s -### 2>&1 | > FileCheck %s --check-prefix=CHECK-ONLY-EXTRA-ASAN > -// CHECK-ONLY-EXTRA-ASAN: argument '-fsanitize=init-order' only allowed with > '-fsanitize=address' > +// CHECK-ONLY-EXTRA-ASAN: '-fsanitize=init-order' is ignored in absence of > '-fsanitize=address' > + > +// RUN: %clang -target x86_64-linux-gnu -Wno-unused-sanitize-argument > -fsanitize=init-order %s -### 2>&1 | FileCheck %s > --check-prefix=CHECK-WNO-UNUSED-SANITIZE-ARGUMENT > +// CHECK-WNO-UNUSED-SANITIZE-ARGUMENT-NOT: '-fsanitize=init-order' is > ignored in absence of '-fsanitize=address' > > // RUN: %clang -target x86_64-linux-gnu -fsanitize-memory-track-origins -pie > %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-ONLY-TRACK-ORIGINS > // CHECK-ONLY-TRACK-ORIGINS: warning: argument unused during compilation: > '-fsanitize-memory-track-origins' > Index: include/clang/Basic/DiagnosticGroups.td > =================================================================== > --- include/clang/Basic/DiagnosticGroups.td > +++ include/clang/Basic/DiagnosticGroups.td > @@ -270,7 +270,9 @@ > def UnnamedTypeTemplateArgs : DiagGroup<"unnamed-type-template-args", > > [CXX98CompatUnnamedTypeTemplateArgs]>; > def UnusedArgument : DiagGroup<"unused-argument">; > -def UnusedCommandLineArgument : DiagGroup<"unused-command-line-argument">; > +def UnusedSanitizeArgument : DiagGroup<"unused-sanitize-argument">; > +def UnusedCommandLineArgument : DiagGroup<"unused-command-line-argument", > + [UnusedSanitizeArgument]>; > def UnusedComparison : DiagGroup<"unused-comparison">; > def UnusedExceptionParameter : DiagGroup<"unused-exception-parameter">; > def UnneededInternalDecl : DiagGroup<"unneeded-internal-declaration">; > Index: include/clang/Basic/DiagnosticDriverKinds.td > =================================================================== > --- include/clang/Basic/DiagnosticDriverKinds.td > +++ include/clang/Basic/DiagnosticDriverKinds.td > @@ -123,6 +123,8 @@ > def warn_drv_empty_joined_argument : Warning< > "joined argument expects additional value: '%0'">, > InGroup<UnusedCommandLineArgument>; > +def warn_drv_unused_sanitizer : Warning<"'%0' is ignored in absence of > '%1'">, > + InGroup<UnusedSanitizeArgument>; > def warn_drv_clang_unsupported : Warning< > "the clang compiler does not support '%0'">; > def warn_drv_deprecated_arg : Warning< > > _______________________________________________ > cfe-commits mailing list > [email protected] > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits > _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
