• Home
  • Raw
  • Download

Lines Matching +full:- +full:fsanitize

1 //===--- SanitizerArgs.cpp - Arguments for sanitizer tools  ---------------===//
8 //===----------------------------------------------------------------------===//
56 /// Parse a -fsanitize= or -fno-sanitize= argument's values, diagnosing any
61 /// Parse -f(no-)?sanitize-coverage= flag values, diagnosing any invalid
67 /// "-fsanitize=thread,vptr -fsanitize=address" with mask \c NeedsUbsanRt
68 /// would produce "-fsanitize=vptr".
75 /// "-fsanitize=address,alignment" with mask \c NeedsUbsanRt would produce
76 /// "-fsanitize=alignment".
80 /// Produce a string containing comma-separated names of sanitizers in \p
129 if (Arg->getOption().matches(options::OPT_fsanitize_trap_EQ)) { in parseSanitizeTrapArgs()
130 Arg->claim(); in parseSanitizeTrapArgs()
136 D.Diag(diag::err_drv_unsupported_option_argument) << "-fsanitize-trap" in parseSanitizeTrapArgs()
140 } else if (Arg->getOption().matches(options::OPT_fno_sanitize_trap_EQ)) { in parseSanitizeTrapArgs()
141 Arg->claim(); in parseSanitizeTrapArgs()
143 } else if (Arg->getOption().matches( in parseSanitizeTrapArgs()
145 Arg->claim(); in parseSanitizeTrapArgs()
148 } else if (Arg->getOption().matches( in parseSanitizeTrapArgs()
150 Arg->claim(); in parseSanitizeTrapArgs()
190 // -fsanitize= flags (directly or via group in SanitizerArgs()
193 // unused-argument diagnostics. in SanitizerArgs()
207 if (Arg->getOption().matches(options::OPT_fsanitize_EQ)) { in SanitizerArgs()
208 Arg->claim(); in SanitizerArgs()
221 << Desc << "-fsanitize-trap=undefined"; in SanitizerArgs()
233 // Test for -fno-rtti + explicit -fsanitizer=vptr before expanding groups in SanitizerArgs()
234 // so we don't error out if -fno-rtti and -fsanitize=undefined were in SanitizerArgs()
248 << "-fsanitize=vptr" << NoRTTIArg->getAsString(Args); in SanitizerArgs()
264 } else if (Arg->getOption().matches(options::OPT_fno_sanitize_EQ)) { in SanitizerArgs()
265 Arg->claim(); in SanitizerArgs()
285 << lastArgumentForMask(D, Args, Kinds & NeedsLTO) << "-flto"; in SanitizerArgs()
288 // Report error if there are non-trapping sanitizers that require in SanitizerArgs()
289 // c++abi-specific parts of UBSan runtime, and they are not provided by the in SanitizerArgs()
302 << ("-fno-sanitize-trap=" + toString(S)) << TC.getTriple().str(); in SanitizerArgs()
331 // FIXME: Currently -fsanitize=leak is silently ignored in the presence of in SanitizerArgs()
332 // -fsanitize=address. Perhaps it should print an error, or perhaps in SanitizerArgs()
333 // -f(-no)sanitize=leak should change whether leak detection is enabled by in SanitizerArgs()
336 // Parse -f(no-)?sanitize-recover flags. in SanitizerArgs()
341 if (Arg->getOption().matches(options::OPT_fsanitize_recover)) { in SanitizerArgs()
343 "-fsanitize-recover=undefined,integer' or '-fsanitize-recover=all"; in SanitizerArgs()
345 Arg->claim(); in SanitizerArgs()
346 } else if (Arg->getOption().matches(options::OPT_fno_sanitize_recover)) { in SanitizerArgs()
347 DeprecatedReplacement = "-fno-sanitize-recover=undefined,integer' or " in SanitizerArgs()
348 "'-fno-sanitize-recover=all"; in SanitizerArgs()
350 Arg->claim(); in SanitizerArgs()
351 } else if (Arg->getOption().matches(options::OPT_fsanitize_recover_EQ)) { in SanitizerArgs()
360 << Arg->getOption().getName() << toString(SetToDiagnose); in SanitizerArgs()
364 Arg->claim(); in SanitizerArgs()
365 } else if (Arg->getOption().matches(options::OPT_fno_sanitize_recover_EQ)) { in SanitizerArgs()
367 Arg->claim(); in SanitizerArgs()
370 D.Diag(diag::warn_drv_deprecated_arg) << Arg->getAsString(Args) in SanitizerArgs()
386 // Parse -f(no-)sanitize-blacklist options. in SanitizerArgs()
388 if (Arg->getOption().matches(options::OPT_fsanitize_blacklist)) { in SanitizerArgs()
389 Arg->claim(); in SanitizerArgs()
390 std::string BLPath = Arg->getValue(); in SanitizerArgs()
397 } else if (Arg->getOption().matches(options::OPT_fno_sanitize_blacklist)) { in SanitizerArgs()
398 Arg->claim(); in SanitizerArgs()
412 // Parse -f[no-]sanitize-memory-track-origins[=level] options. in SanitizerArgs()
418 if (A->getOption().matches(options::OPT_fsanitize_memory_track_origins)) { in SanitizerArgs()
420 } else if (A->getOption().matches( in SanitizerArgs()
424 StringRef S = A->getValue(); in SanitizerArgs()
427 D.Diag(clang::diag::err_drv_invalid_value) << A->getAsString(Args) << S; in SanitizerArgs()
448 // Parse -f(no-)?sanitize-coverage flags if coverage is supported by the in SanitizerArgs()
451 if (Arg->getOption().matches(options::OPT_fsanitize_coverage)) { in SanitizerArgs()
453 if (Arg->getNumValues() == 1 && in SanitizerArgs()
454 !StringRef(Arg->getValue(0)) in SanitizerArgs()
460 Arg->claim(); in SanitizerArgs()
463 D.Diag(diag::warn_drv_deprecated_arg) << Arg->getAsString(Args) in SanitizerArgs()
464 << "-fsanitize-coverage=func"; in SanitizerArgs()
468 D.Diag(diag::warn_drv_deprecated_arg) << Arg->getAsString(Args) in SanitizerArgs()
469 << "-fsanitize-coverage=bb"; in SanitizerArgs()
473 D.Diag(diag::warn_drv_deprecated_arg) << Arg->getAsString(Args) in SanitizerArgs()
474 << "-fsanitize-coverage=edge"; in SanitizerArgs()
479 << Arg->getAsString(Args) in SanitizerArgs()
480 << "-fsanitize-coverage=edge,indirect-calls"; in SanitizerArgs()
489 // non-supporting sanitizer. in SanitizerArgs()
491 Arg->claim(); in SanitizerArgs()
495 } else if (Arg->getOption().matches(options::OPT_fno_sanitize_coverage)) { in SanitizerArgs()
496 Arg->claim(); in SanitizerArgs()
503 << "-fsanitize-coverage=func" in SanitizerArgs()
504 << "-fsanitize-coverage=bb"; in SanitizerArgs()
507 << "-fsanitize-coverage=func" in SanitizerArgs()
508 << "-fsanitize-coverage=edge"; in SanitizerArgs()
511 << "-fsanitize-coverage=bb" in SanitizerArgs()
512 << "-fsanitize-coverage=edge"; in SanitizerArgs()
513 // Basic block tracing and 8-bit counters require some type of coverage in SanitizerArgs()
519 << "-fsanitize-coverage=trace-bb" in SanitizerArgs()
520 << "-fsanitize-coverage=(func|bb|edge)"; in SanitizerArgs()
524 << "-fsanitize-coverage=8bit-counters" in SanitizerArgs()
525 << "-fsanitize-coverage=(func|bb|edge)"; in SanitizerArgs()
526 // trace-pc w/o func/bb/edge implies edge. in SanitizerArgs()
537 StringRef S = A->getValue(); in SanitizerArgs()
541 D.Diag(clang::diag::err_drv_invalid_value) << A->getAsString(Args) << S; in SanitizerArgs()
549 switch (WindowsDebugRTArg->getOption().getID()) { in SanitizerArgs()
554 << WindowsDebugRTArg->getAsString(Args) in SanitizerArgs()
565 << "-fsanitize-address-use-after-scope" in SanitizerArgs()
566 << "-fsanitize=address"; in SanitizerArgs()
569 // Parse -link-cxx-sanitizer flag. in SanitizerArgs()
596 LinkerOptionFlag = "--linker-option=/include:"; in addIncludeLinkerOption()
608 // Translate available CoverageFeatures to corresponding clang-cc1 flags. in addArgs()
612 std::make_pair(CoverageFunc, "-fsanitize-coverage-type=1"), in addArgs()
613 std::make_pair(CoverageBB, "-fsanitize-coverage-type=2"), in addArgs()
614 std::make_pair(CoverageEdge, "-fsanitize-coverage-type=3"), in addArgs()
615 std::make_pair(CoverageIndirCall, "-fsanitize-coverage-indirect-calls"), in addArgs()
616 std::make_pair(CoverageTraceBB, "-fsanitize-coverage-trace-bb"), in addArgs()
617 std::make_pair(CoverageTraceCmp, "-fsanitize-coverage-trace-cmp"), in addArgs()
618 std::make_pair(Coverage8bitCounters, "-fsanitize-coverage-8bit-counters"), in addArgs()
619 std::make_pair(CoverageTracePC, "-fsanitize-coverage-trace-pc")}; in addArgs()
629 "--dependent-lib=" + TC.getCompilerRT(Args, "ubsan_standalone"))); in addArgs()
632 "--dependent-lib=" + TC.getCompilerRT(Args, "ubsan_standalone_cxx"))); in addArgs()
635 CmdArgs.push_back(Args.MakeArgString("--dependent-lib=" + in addArgs()
642 CmdArgs.push_back(Args.MakeArgString("--dependent-lib=" + in addArgs()
649 CmdArgs.push_back(Args.MakeArgString("-fsanitize=" + toString(Sanitizers))); in addArgs()
652 CmdArgs.push_back(Args.MakeArgString("-fsanitize-recover=" + in addArgs()
657 Args.MakeArgString("-fsanitize-trap=" + toString(TrapSanitizers))); in addArgs()
660 SmallString<64> BlacklistOpt("-fsanitize-blacklist="); in addArgs()
665 SmallString<64> ExtraDepOpt("-fdepfile-entry="); in addArgs()
671 CmdArgs.push_back(Args.MakeArgString("-fsanitize-memory-track-origins=" + in addArgs()
675 CmdArgs.push_back(Args.MakeArgString("-fsanitize-memory-use-after-dtor")); in addArgs()
678 CmdArgs.push_back(Args.MakeArgString("-fsanitize-cfi-cross-dso")); in addArgs()
681 CmdArgs.push_back(Args.MakeArgString("-fsanitize-stats")); in addArgs()
684 CmdArgs.push_back(Args.MakeArgString("-fsanitize-address-field-padding=" + in addArgs()
688 CmdArgs.push_back(Args.MakeArgString("-fsanitize-address-use-after-scope")); in addArgs()
692 // https://code.google.com/p/address-sanitizer/issues/detail?id=373 in addArgs()
693 // We can't make this conditional on -fsanitize=leak, as that flag shouldn't in addArgs()
696 CmdArgs.push_back(Args.MakeArgString("-fno-assume-sane-operator-new")); in addArgs()
698 // Require -fvisibility= flag on non-Windows when compiling if vptr CFI is in addArgs()
705 << "-fvisibility="; in addArgs()
711 assert((A->getOption().matches(options::OPT_fsanitize_EQ) || in parseArgValues()
712 A->getOption().matches(options::OPT_fno_sanitize_EQ) || in parseArgValues()
713 A->getOption().matches(options::OPT_fsanitize_recover_EQ) || in parseArgValues()
714 A->getOption().matches(options::OPT_fno_sanitize_recover_EQ) || in parseArgValues()
715 A->getOption().matches(options::OPT_fsanitize_trap_EQ) || in parseArgValues()
716 A->getOption().matches(options::OPT_fno_sanitize_trap_EQ)) && in parseArgValues()
719 for (int i = 0, n = A->getNumValues(); i != n; ++i) { in parseArgValues()
720 const char *Value = A->getValue(i); in parseArgValues()
722 // Special case: don't accept -fsanitize=all. in parseArgValues()
723 if (A->getOption().matches(options::OPT_fsanitize_EQ) && in parseArgValues()
726 // Similarly, don't accept -fsanitize=efficiency-all. in parseArgValues()
727 else if (A->getOption().matches(options::OPT_fsanitize_EQ) && in parseArgValues()
728 0 == strcmp("efficiency-all", Value)) in parseArgValues()
737 << A->getOption().getName() << Value; in parseArgValues()
743 assert(A->getOption().matches(options::OPT_fsanitize_coverage) || in parseCoverageFeatures()
744 A->getOption().matches(options::OPT_fno_sanitize_coverage)); in parseCoverageFeatures()
746 for (int i = 0, n = A->getNumValues(); i != n; ++i) { in parseCoverageFeatures()
747 const char *Value = A->getValue(i); in parseCoverageFeatures()
752 .Case("indirect-calls", CoverageIndirCall) in parseCoverageFeatures()
753 .Case("trace-bb", CoverageTraceBB) in parseCoverageFeatures()
754 .Case("trace-cmp", CoverageTraceCmp) in parseCoverageFeatures()
755 .Case("8bit-counters", Coverage8bitCounters) in parseCoverageFeatures()
756 .Case("trace-pc", CoverageTracePC) in parseCoverageFeatures()
760 << A->getOption().getName() << Value; in parseCoverageFeatures()
772 if (Arg->getOption().matches(options::OPT_fsanitize_EQ)) { in lastArgumentForMask()
777 } else if (Arg->getOption().matches(options::OPT_fno_sanitize_EQ)) { in lastArgumentForMask()
787 assert(A->getOption().matches(options::OPT_fsanitize_EQ) in describeSanitizeArg()
791 for (int i = 0, n = A->getNumValues(); i != n; ++i) { in describeSanitizeArg()
793 parseSanitizerValue(A->getValue(i), /*AllowGroups=*/true)) & in describeSanitizeArg()
797 Sanitizers += A->getValue(i); in describeSanitizeArg()
802 return "-fsanitize=" + Sanitizers; in describeSanitizeArg()