BugReporter.h revision 6837faa083bebad39aa342f84c2b450fb6410eaf
161f3e058056ab519d249aa67e3d52b0ead57c63eTed Kremenek// BugReporter.h - Generate PathDiagnostics  ----------*- C++ -*--//
261f3e058056ab519d249aa67e3d52b0ead57c63eTed Kremenek//
361f3e058056ab519d249aa67e3d52b0ead57c63eTed Kremenek//                     The LLVM Compiler Infrastructure
461f3e058056ab519d249aa67e3d52b0ead57c63eTed Kremenek//
561f3e058056ab519d249aa67e3d52b0ead57c63eTed Kremenek// This file is distributed under the University of Illinois Open Source
661f3e058056ab519d249aa67e3d52b0ead57c63eTed Kremenek// License. See LICENSE.TXT for details.
761f3e058056ab519d249aa67e3d52b0ead57c63eTed Kremenek//
861f3e058056ab519d249aa67e3d52b0ead57c63eTed Kremenek//===----------------------------------------------------------------------===//
961f3e058056ab519d249aa67e3d52b0ead57c63eTed Kremenek//
1061f3e058056ab519d249aa67e3d52b0ead57c63eTed Kremenek//  This file defines BugReporter, a utility class for generating
1161f3e058056ab519d249aa67e3d52b0ead57c63eTed Kremenek//  PathDiagnostics for analyses based on ValueState.
1261f3e058056ab519d249aa67e3d52b0ead57c63eTed Kremenek//
1361f3e058056ab519d249aa67e3d52b0ead57c63eTed Kremenek//===----------------------------------------------------------------------===//
1461f3e058056ab519d249aa67e3d52b0ead57c63eTed Kremenek
1561f3e058056ab519d249aa67e3d52b0ead57c63eTed Kremenek#ifndef LLVM_CLANG_ANALYSIS_BUGREPORTER
1661f3e058056ab519d249aa67e3d52b0ead57c63eTed Kremenek#define LLVM_CLANG_ANALYSIS_BUGREPORTER
1761f3e058056ab519d249aa67e3d52b0ead57c63eTed Kremenek
1861f3e058056ab519d249aa67e3d52b0ead57c63eTed Kremenek#include "clang/Analysis/PathSensitive/ValueState.h"
1961f3e058056ab519d249aa67e3d52b0ead57c63eTed Kremenek#include "clang/Analysis/PathSensitive/ExplodedGraph.h"
2061f3e058056ab519d249aa67e3d52b0ead57c63eTed Kremenek#include "llvm/ADT/SmallPtrSet.h"
2161f3e058056ab519d249aa67e3d52b0ead57c63eTed Kremenek
2261f3e058056ab519d249aa67e3d52b0ead57c63eTed Kremenek// FIXME: ExplodedGraph<> should be templated on state, not the checker engine.
2361f3e058056ab519d249aa67e3d52b0ead57c63eTed Kremenek#include "clang/Analysis/PathSensitive/GRExprEngine.h"
2461f3e058056ab519d249aa67e3d52b0ead57c63eTed Kremenek
2561f3e058056ab519d249aa67e3d52b0ead57c63eTed Kremeneknamespace clang {
2661f3e058056ab519d249aa67e3d52b0ead57c63eTed Kremenek
2761f3e058056ab519d249aa67e3d52b0ead57c63eTed Kremenekclass PathDiagnostic;
2861f3e058056ab519d249aa67e3d52b0ead57c63eTed Kremenekclass PathDiagnosticPiece;
2961f3e058056ab519d249aa67e3d52b0ead57c63eTed Kremenekclass PathDiagnosticClient;
3061f3e058056ab519d249aa67e3d52b0ead57c63eTed Kremenekclass ASTContext;
3161f3e058056ab519d249aa67e3d52b0ead57c63eTed Kremenekclass Diagnostic;
3261f3e058056ab519d249aa67e3d52b0ead57c63eTed Kremenek
3361f3e058056ab519d249aa67e3d52b0ead57c63eTed Kremenekclass BugDescription {
3461f3e058056ab519d249aa67e3d52b0ead57c63eTed Kremenekpublic:
3561f3e058056ab519d249aa67e3d52b0ead57c63eTed Kremenek  BugDescription() {}
3661f3e058056ab519d249aa67e3d52b0ead57c63eTed Kremenek  virtual ~BugDescription() {}
3761f3e058056ab519d249aa67e3d52b0ead57c63eTed Kremenek
3861f3e058056ab519d249aa67e3d52b0ead57c63eTed Kremenek  virtual const char* getName() const = 0;
3961f3e058056ab519d249aa67e3d52b0ead57c63eTed Kremenek
4061f3e058056ab519d249aa67e3d52b0ead57c63eTed Kremenek  virtual const char* getDescription() const = 0;
4161f3e058056ab519d249aa67e3d52b0ead57c63eTed Kremenek
4261f3e058056ab519d249aa67e3d52b0ead57c63eTed Kremenek  virtual PathDiagnosticPiece* getEndPath(ASTContext& Ctx,
4361f3e058056ab519d249aa67e3d52b0ead57c63eTed Kremenek                                          ExplodedNode<ValueState> *N) const;
44f1ae705460552655fe7275327804444c62e86baeTed Kremenek
45f1ae705460552655fe7275327804444c62e86baeTed Kremenek  virtual void getRanges(const SourceRange*& beg,
46f1ae705460552655fe7275327804444c62e86baeTed Kremenek                         const SourceRange*& end) const;
4761f3e058056ab519d249aa67e3d52b0ead57c63eTed Kremenek};
4861f3e058056ab519d249aa67e3d52b0ead57c63eTed Kremenek
496837faa083bebad39aa342f84c2b450fb6410eafTed Kremenekclass BugReporterHelper {
506837faa083bebad39aa342f84c2b450fb6410eafTed Kremenekpublic:
516837faa083bebad39aa342f84c2b450fb6410eafTed Kremenek  virtual ~BugReporterHelper() {}
526837faa083bebad39aa342f84c2b450fb6410eafTed Kremenek
536837faa083bebad39aa342f84c2b450fb6410eafTed Kremenek  virtual PathDiagnosticPiece* VisitNode(ExplodedNode<ValueState>* N,
546837faa083bebad39aa342f84c2b450fb6410eafTed Kremenek                                         ExplodedNode<ValueState>* PrevN,
556837faa083bebad39aa342f84c2b450fb6410eafTed Kremenek                                         ExplodedGraph<GRExprEngine>& G,
566837faa083bebad39aa342f84c2b450fb6410eafTed Kremenek                                         ASTContext& Ctx) = 0;
576837faa083bebad39aa342f84c2b450fb6410eafTed Kremenek};
586837faa083bebad39aa342f84c2b450fb6410eafTed Kremenek
5961f3e058056ab519d249aa67e3d52b0ead57c63eTed Kremenekclass BugReporter {
6061f3e058056ab519d249aa67e3d52b0ead57c63eTed Kremenek  llvm::SmallPtrSet<void*,10> CachedErrors;
6161f3e058056ab519d249aa67e3d52b0ead57c63eTed Kremenek
6261f3e058056ab519d249aa67e3d52b0ead57c63eTed Kremenekpublic:
6361f3e058056ab519d249aa67e3d52b0ead57c63eTed Kremenek  BugReporter() {}
6461f3e058056ab519d249aa67e3d52b0ead57c63eTed Kremenek  ~BugReporter();
6561f3e058056ab519d249aa67e3d52b0ead57c63eTed Kremenek
6661f3e058056ab519d249aa67e3d52b0ead57c63eTed Kremenek  void EmitPathWarning(Diagnostic& Diag, PathDiagnosticClient* PDC,
6761f3e058056ab519d249aa67e3d52b0ead57c63eTed Kremenek                       ASTContext& Ctx, const BugDescription& B,
6861f3e058056ab519d249aa67e3d52b0ead57c63eTed Kremenek                       ExplodedGraph<GRExprEngine>& G,
696837faa083bebad39aa342f84c2b450fb6410eafTed Kremenek                       ExplodedNode<ValueState>* N,
706837faa083bebad39aa342f84c2b450fb6410eafTed Kremenek                       BugReporterHelper** BegHelpers = NULL,
716837faa083bebad39aa342f84c2b450fb6410eafTed Kremenek                       BugReporterHelper** EndHelpers = NULL);
7261f3e058056ab519d249aa67e3d52b0ead57c63eTed Kremenek
7361f3e058056ab519d249aa67e3d52b0ead57c63eTed Kremenek  void EmitWarning(Diagnostic& Diag, ASTContext& Ctx,
7461f3e058056ab519d249aa67e3d52b0ead57c63eTed Kremenek                   const BugDescription& B,
7561f3e058056ab519d249aa67e3d52b0ead57c63eTed Kremenek                   ExplodedNode<ValueState>* N);
7661f3e058056ab519d249aa67e3d52b0ead57c63eTed Kremenek
7761f3e058056ab519d249aa67e3d52b0ead57c63eTed Kremenek
7861f3e058056ab519d249aa67e3d52b0ead57c63eTed Kremenekprivate:
7961f3e058056ab519d249aa67e3d52b0ead57c63eTed Kremenek  bool IsCached(ExplodedNode<ValueState>* N);
8061f3e058056ab519d249aa67e3d52b0ead57c63eTed Kremenek
8161f3e058056ab519d249aa67e3d52b0ead57c63eTed Kremenek  void GeneratePathDiagnostic(PathDiagnostic& PD, ASTContext& Ctx,
8261f3e058056ab519d249aa67e3d52b0ead57c63eTed Kremenek                              const BugDescription& B,
8361f3e058056ab519d249aa67e3d52b0ead57c63eTed Kremenek                              ExplodedGraph<GRExprEngine>& G,
846837faa083bebad39aa342f84c2b450fb6410eafTed Kremenek                              ExplodedNode<ValueState>* N,
856837faa083bebad39aa342f84c2b450fb6410eafTed Kremenek                              BugReporterHelper** BegHelpers = NULL,
866837faa083bebad39aa342f84c2b450fb6410eafTed Kremenek                              BugReporterHelper** EndHelpers = NULL);
8761f3e058056ab519d249aa67e3d52b0ead57c63eTed Kremenek};
8861f3e058056ab519d249aa67e3d52b0ead57c63eTed Kremenek
8961f3e058056ab519d249aa67e3d52b0ead57c63eTed Kremenek} // end clang namespace
9061f3e058056ab519d249aa67e3d52b0ead57c63eTed Kremenek
9161f3e058056ab519d249aa67e3d52b0ead57c63eTed Kremenek#endif
92