BugType.h revision 4587cace907ed9a68256bdae506fbb8d93ac232c
12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//===---  BugType.h - Bug Information Desciption ----------------*- C++ -*-===//
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//                     The LLVM Compiler Infrastructure
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// This file is distributed under the University of Illinois Open Source
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// License. See LICENSE.TXT for details.
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//===----------------------------------------------------------------------===//
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//  This file defines BugType, a class representing a bug type.
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//===----------------------------------------------------------------------===//
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef LLVM_CLANG_ANALYSIS_BUGTYPE
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define LLVM_CLANG_ANALYSIS_BUGTYPE
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "clang/Basic/LLVM.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "clang/StaticAnalyzer/Checkers/CommonBugCategories.h"
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "llvm/ADT/FoldingSet.h"
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <string>
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace clang {
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace ento {
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class BugReporter;
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ExplodedNode;
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ExprEngine;
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class BugType {
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)private:
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const std::string Name;
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const std::string Category;
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool SuppressonSink;
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public:
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  BugType(StringRef name, StringRef cat)
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : Name(name), Category(cat), SuppressonSink(false) {}
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~BugType();
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // FIXME: Should these be made strings as well?
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  StringRef getName() const { return Name; }
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  StringRef getCategory() const { return Category; }
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  /// isSuppressOnSink - Returns true if bug reports associated with this bug
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ///  type should be suppressed if the end node of the report is post-dominated
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ///  by a sink node.
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool isSuppressOnSink() const { return SuppressonSink; }
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void setSuppressOnSink(bool x) { SuppressonSink = x; }
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void FlushReports(BugReporter& BR);
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class BuiltinBug : public BugType {
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void anchor();
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const std::string desc;
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public:
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  BuiltinBug(const char *name, const char *description)
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : BugType(name, categories::LogicError), desc(description) {}
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  BuiltinBug(const char *name)
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : BugType(name, categories::LogicError), desc(name) {}
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  StringRef getDescription() const { return desc; }
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // end GR namespace
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // end clang namespace
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)