diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -2941,6 +2941,10 @@ // Default nullability checks. CmdArgs.push_back("-analyzer-checker=nullability.NullPassedToNonnull"); CmdArgs.push_back("-analyzer-checker=nullability.NullReturnedFromNonnull"); + } else { + // These pseudo-checkers handle assert-like functions and generate no + // warnings. They are required to prevent massive false-positive findings. + CmdArgs.push_back("-analyzer-checker=core.builtin"); } // Set the output format. The default is plist, for (lame) historical reasons. diff --git a/clang/test/Analysis/no-default-checks.cpp b/clang/test/Analysis/no-default-checks.cpp new file mode 100644 --- /dev/null +++ b/clang/test/Analysis/no-default-checks.cpp @@ -0,0 +1,19 @@ +// RUN: %clang -std=c++14 --analyze --analyzer-no-default-checks -Xclang -analyzer-checker=core.CallAndMessage -Xclang -verify %s -o - + +// expected-no-diagnostics + +inline constexpr bool AnalyzerNoReturn() __attribute__((analyzer_noreturn)) { + return false; +} + +struct A { + int size(); +}; + +int foo(A* pa) { + if (!pa) + AnalyzerNoReturn(); + // No warning on "Called C++ object pointer is null" is expected + // as |pa| has already been checked for nullptr by this point. + return pa->size(); +} \ No newline at end of file