r178513 - [analyzer] Allow suppressing diagnostics reported within the 'std' namespace

Anna Zaks ganna at apple.com
Mon Apr 1 18:31:43 PDT 2013


On Apr 1, 2013, at 5:26 PM, Jordan Rose <jordan_rose at apple.com> wrote:

> Author: jrose
> Date: Mon Apr  1 19:26:15 2013
> New Revision: 178513
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=178513&view=rev
> Log:
> [analyzer] Allow suppressing diagnostics reported within the 'std' namespace
> 
> This is controlled by the 'suppress-c++-stdlib' analyzer-config flag.
> It is currently off by default.
> 
> This is more suppression than we'd like to do, since obviously there can
> be user-caused issues within 'std', but it gives us the option to wield
> a large hammer to suppress false positives the user likely can't work
> around.
> 
> Added:
>    cfe/trunk/test/Analysis/diagnostics/explicit-suppression.cpp
> Modified:
>    cfe/trunk/include/clang/StaticAnalyzer/Core/AnalyzerOptions.h
>    cfe/trunk/lib/StaticAnalyzer/Core/AnalyzerOptions.cpp
>    cfe/trunk/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp
>    cfe/trunk/test/Analysis/Inputs/system-header-simulator-cxx.h
> 
> Modified: cfe/trunk/include/clang/StaticAnalyzer/Core/AnalyzerOptions.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/StaticAnalyzer/Core/AnalyzerOptions.h?rev=178513&r1=178512&r2=178513&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/StaticAnalyzer/Core/AnalyzerOptions.h (original)
> +++ cfe/trunk/include/clang/StaticAnalyzer/Core/AnalyzerOptions.h Mon Apr  1 19:26:15 2013
> @@ -217,6 +217,9 @@ private:
>   /// \sa shouldSuppressInlinedDefensiveChecks
>   Optional<bool> SuppressInlinedDefensiveChecks;
> 
> +  /// \sa shouldSuppressFromCXXStandardLibrary
> +  Optional<bool> SuppressFromCXXStandardLibrary;
> +
>   /// \sa getGraphTrimInterval
>   Optional<unsigned> GraphTrimInterval;
> 
> @@ -306,6 +309,13 @@ public:
>   /// option, which accepts the values "true" and "false".
>   bool shouldSuppressInlinedDefensiveChecks();
> 
> +  /// Returns whether or not diagnostics reported within the C++ standard
> +  /// library should be suppressed.
> +  ///
> +  /// This is controlled by the 'suppress-c++-stdlib' config option,
> +  /// which accepts the values "true" and "false".
> +  bool shouldSuppressFromCXXStandardLibrary();
> +
>   /// Returns whether irrelevant parts of a bug report path should be pruned
>   /// out of the final output.
>   ///
> 
> Modified: cfe/trunk/lib/StaticAnalyzer/Core/AnalyzerOptions.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Core/AnalyzerOptions.cpp?rev=178513&r1=178512&r2=178513&view=diff
> ==============================================================================
> --- cfe/trunk/lib/StaticAnalyzer/Core/AnalyzerOptions.cpp (original)
> +++ cfe/trunk/lib/StaticAnalyzer/Core/AnalyzerOptions.cpp Mon Apr  1 19:26:15 2013
> @@ -158,6 +158,12 @@ bool AnalyzerOptions::shouldSuppressInli
>                           /* Default = */ true);
> }
> 
> +bool AnalyzerOptions::shouldSuppressFromCXXStandardLibrary() {
> +  return getBooleanOption(SuppressFromCXXStandardLibrary,
> +                          "suppress-c++-stdlib",
> +                          /* Default = */ false);
> +}
> +
> int AnalyzerOptions::getOptionAsInteger(StringRef Name, int DefaultVal) {
>   SmallString<10> StrBuf;
>   llvm::raw_svector_ostream OS(StrBuf);
> 
> Modified: cfe/trunk/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp?rev=178513&r1=178512&r2=178513&view=diff
> ==============================================================================
> --- cfe/trunk/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp (original)
> +++ cfe/trunk/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp Mon Apr  1 19:26:15 2013
> @@ -1421,28 +1421,53 @@ ConditionBRVisitor::VisitTrueTest(const
>   return event;
> }
> 
> +
> +// FIXME: Copied from ExprEngineCallAndReturn.cpp.
> +static bool isInStdNamespace(const Decl *D) {
> +  const DeclContext *DC = D->getDeclContext()->getEnclosingNamespaceContext();
> +  const NamespaceDecl *ND = dyn_cast<NamespaceDecl>(DC);
> +  if (!ND)
> +    return false;
> +
> +  while (const NamespaceDecl *Parent = dyn_cast<NamespaceDecl>(ND->getParent()))
> +    ND = Parent;
> +
> +  return ND->getName() == "std";
> +}
> +
> +
> PathDiagnosticPiece *
> LikelyFalsePositiveSuppressionBRVisitor::getEndPath(BugReporterContext &BRC,
>                                                     const ExplodedNode *N,
>                                                     BugReport &BR) {
> -  const Stmt *S = BR.getStmt();
> -  if (!S)
> -    return 0;
> -
> -  // Here we suppress false positives coming from system macros. This list is
> +  // Here we suppress false positives coming from system headers. This list is
>   // based on known issues.
> 
> +  // Skip reports within the 'std' namespace. Although these can sometimes be
> +  // the user's fault, we currently don't report them very well, and
> +  // Note that this will not help for any other data structure libraries, like
> +  // TR1, Boost, or llvm/ADT.
> +  ExprEngine &Eng = BRC.getBugReporter().getEngine();
> +  AnalyzerOptions &Options = Eng.getAnalysisManager().options;
> +  if (Options.shouldSuppressFromCXXStandardLibrary()) {
> +    const LocationContext *LCtx = N->getLocationContext();
> +    if (isInStdNamespace(LCtx->getDecl())) {
> +      BR.markInvalid(getTag(), 0);
> +      return 0;
> +    }
> +  }
> +
>   // Skip reports within the sys/queue.h macros as we do not have the ability to
>   // reason about data structure shapes.
>   SourceManager &SM = BRC.getSourceManager();
> -  SourceLocation Loc = S->getLocStart();
> +  FullSourceLoc Loc = BR.getLocation(SM).asLocation();
>   while (Loc.isMacroID()) {
>     if (SM.isInSystemMacro(Loc) &&
>        (SM.getFilename(SM.getSpellingLoc(Loc)).endswith("sys/queue.h"))) {
>       BR.markInvalid(getTag(), 0);
>       return 0;
>     }
> -    Loc = SM.getSpellingLoc(Loc);
> +    Loc = Loc.getSpellingLoc();
>   }
> 
>   return 0;
> 
> Modified: cfe/trunk/test/Analysis/Inputs/system-header-simulator-cxx.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/Inputs/system-header-simulator-cxx.h?rev=178513&r1=178512&r2=178513&view=diff
> ==============================================================================
> --- cfe/trunk/test/Analysis/Inputs/system-header-simulator-cxx.h (original)
> +++ cfe/trunk/test/Analysis/Inputs/system-header-simulator-cxx.h Mon Apr  1 19:26:15 2013
> @@ -73,6 +73,13 @@ namespace std {
>   struct nothrow_t {};
> 
>   extern const nothrow_t nothrow;
> +
> +  template<class InputIter, class OutputIter>
> +  OutputIter copy(InputIter II, InputIter IE, OutputIter OI) {
> +    while (II != IE)
> +      *OI++ = *II++;
> +    return OI;
> +  }
> }
> 
> void* operator new(std::size_t, const std::nothrow_t&) throw();
> 
> Added: cfe/trunk/test/Analysis/diagnostics/explicit-suppression.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/diagnostics/explicit-suppression.cpp?rev=178513&view=auto
> ==============================================================================
> --- cfe/trunk/test/Analysis/diagnostics/explicit-suppression.cpp (added)
> +++ cfe/trunk/test/Analysis/diagnostics/explicit-suppression.cpp Mon Apr  1 19:26:15 2013
> @@ -0,0 +1,71 @@
> +// RUN: %clang_cc1 -analyze -analyzer-checker=core,debug.ExprInspection -analyzer-config suppress-c++-stdlib=false -verify %s
> +// RUN: %clang_cc1 -analyze -analyzer-checker=core,debug.ExprInspection -analyzer-config suppress-c++-stdlib=true -DSUPPRESSED=1 -verify %s
> +
> +#ifdef SUPPRESSED
> +// expected-no-diagnostics
> +#endif
> +
> +#include "../Inputs/system-header-simulator-cxx.h"
> +
> +void clang_analyzer_eval(bool);
> +
> +void testCopyNull(int *I, int *E) {
> +  std::copy(I, E, (int *)0);
> +#ifndef SUPPRESSED
> +  // This line number comes from system-header-simulator-cxx.h.
> +  // expected-warning at 65 {{Dereference of null pointer}}
> +#endif
> +}
> +
> +

These new lines are probably unintentional.

> +
> +
> +
> +
> +
> +
> +
> +
> +
> +
> +
> +
> +
> +
> +
> +
> +
> +
> +
> +
> +
> +
> +
> +
> +
> +
> +
> +
> +
> +
> +
> +
> +
> +
> +
> +
> +
> +
> +
> +
> +
> +
> +
> +
> +
> +
> +
> +
> +// PR15613: expected-* can't refer to diagnostics in other source files.
> +// The current implementation only matches line numbers, but has an upper limit
> +// of the number of lines in the main source file.
> 
> 
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20130401/0a73b833/attachment.html>


More information about the cfe-commits mailing list