1//===---  BugType.h - Bug Information Desciption ----------------*- C++ -*-===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10//  This file defines BugType, a class representing a bug type.
11//
12//===----------------------------------------------------------------------===//
13
14#ifndef LLVM_CLANG_STATICANALYZER_CORE_BUGREPORTER_BUGTYPE_H
15#define LLVM_CLANG_STATICANALYZER_CORE_BUGREPORTER_BUGTYPE_H
16
17#include "clang/Basic/LLVM.h"
18#include "clang/StaticAnalyzer/Core/BugReporter/CommonBugCategories.h"
19#include "clang/StaticAnalyzer/Core/Checker.h"
20#include <string>
21
22namespace clang {
23
24namespace ento {
25
26class BugReporter;
27class ExplodedNode;
28class ExprEngine;
29
30class BugType {
31private:
32  const CheckName Check;
33  const std::string Name;
34  const std::string Category;
35  const CheckerBase *Checker;
36  bool SuppressOnSink;
37
38  virtual void anchor();
39
40public:
41  BugType(CheckName Check, StringRef Name, StringRef Cat)
42      : Check(Check), Name(Name), Category(Cat), Checker(nullptr),
43        SuppressOnSink(false) {}
44  BugType(const CheckerBase *Checker, StringRef Name, StringRef Cat)
45      : Check(Checker->getCheckName()), Name(Name), Category(Cat),
46        Checker(Checker), SuppressOnSink(false) {}
47  virtual ~BugType() = default;
48
49  StringRef getName() const { return Name; }
50  StringRef getCategory() const { return Category; }
51  StringRef getCheckName() const {
52    // FIXME: This is a workaround to ensure that the correct check name is used
53    // The check names are set after the constructors are run.
54    // In case the BugType object is initialized in the checker's ctor
55    // the Check field will be empty. To circumvent this problem we use
56    // CheckerBase whenever it is possible.
57    StringRef CheckName =
58        Checker ? Checker->getCheckName().getName() : Check.getName();
59    assert(!CheckName.empty() && "Check name is not set properly.");
60    return CheckName;
61  }
62
63  /// isSuppressOnSink - Returns true if bug reports associated with this bug
64  ///  type should be suppressed if the end node of the report is post-dominated
65  ///  by a sink node.
66  bool isSuppressOnSink() const { return SuppressOnSink; }
67  void setSuppressOnSink(bool x) { SuppressOnSink = x; }
68
69  virtual void FlushReports(BugReporter& BR);
70};
71
72class BuiltinBug : public BugType {
73  const std::string desc;
74  void anchor() override;
75public:
76  BuiltinBug(class CheckName check, const char *name, const char *description)
77      : BugType(check, name, categories::LogicError), desc(description) {}
78
79  BuiltinBug(const CheckerBase *checker, const char *name,
80             const char *description)
81      : BugType(checker, name, categories::LogicError), desc(description) {}
82
83  BuiltinBug(const CheckerBase *checker, const char *name)
84      : BugType(checker, name, categories::LogicError), desc(name) {}
85
86  StringRef getDescription() const { return desc; }
87};
88
89} // end ento namespace
90
91} // end clang namespace
92#endif
93