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