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