blob: a5af327195144d33fddab708ed6e6a76179ed746 [file] [log] [blame]
// BugReporter.h - Generate PathDiagnostics ----------*- C++ -*--//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// This file defines BugReporter, a utility class for generating
// PathDiagnostics for analyses based on ValueState.
//
//===----------------------------------------------------------------------===//
#ifndef LLVM_CLANG_ANALYSIS_BUGREPORTER
#define LLVM_CLANG_ANALYSIS_BUGREPORTER
#include "clang/Analysis/PathSensitive/ValueState.h"
#include "clang/Analysis/PathSensitive/ExplodedGraph.h"
#include "llvm/ADT/SmallPtrSet.h"
// FIXME: ExplodedGraph<> should be templated on state, not the checker engine.
#include "clang/Analysis/PathSensitive/GRExprEngine.h"
namespace clang {
class PathDiagnostic;
class PathDiagnosticPiece;
class PathDiagnosticClient;
class ASTContext;
class Diagnostic;
class BugDescription {
public:
BugDescription() {}
virtual ~BugDescription() {}
virtual const char* getName() const = 0;
virtual const char* getDescription() const = 0;
virtual PathDiagnosticPiece* getEndPath(ASTContext& Ctx,
ExplodedNode<ValueState> *N) const;
virtual void getRanges(const SourceRange*& beg,
const SourceRange*& end) const;
};
class BugReporter {
llvm::SmallPtrSet<void*,10> CachedErrors;
public:
BugReporter() {}
~BugReporter();
void EmitPathWarning(Diagnostic& Diag, PathDiagnosticClient* PDC,
ASTContext& Ctx, const BugDescription& B,
ExplodedGraph<GRExprEngine>& G,
ExplodedNode<ValueState>* N);
void EmitWarning(Diagnostic& Diag, ASTContext& Ctx,
const BugDescription& B,
ExplodedNode<ValueState>* N);
private:
bool IsCached(ExplodedNode<ValueState>* N);
void GeneratePathDiagnostic(PathDiagnostic& PD, ASTContext& Ctx,
const BugDescription& B,
ExplodedGraph<GRExprEngine>& G,
ExplodedNode<ValueState>* N);
};
} // end clang namespace
#endif