clang  10.0.0svn
BugType.h
Go to the documentation of this file.
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"
19 #include <string>
20 
21 namespace clang {
22 
23 namespace ento {
24 
25 class BugReporter;
26 class ExplodedNode;
27 class ExprEngine;
28 
29 class BugType {
30 private:
31  const CheckerNameRef CheckerName;
32  const std::string Description;
33  const std::string Category;
34  const CheckerBase *Checker;
35  bool SuppressOnSink;
36 
37  virtual void anchor();
38 
39 public:
40  BugType(CheckerNameRef CheckerName, StringRef Name, StringRef Cat,
41  bool SuppressOnSink = false)
42  : CheckerName(CheckerName), Description(Name), Category(Cat),
43  Checker(nullptr), SuppressOnSink(SuppressOnSink) {}
44  BugType(const CheckerBase *Checker, StringRef Name, StringRef Cat,
45  bool SuppressOnSink = false)
46  : CheckerName(Checker->getCheckerName()), Description(Name),
47  Category(Cat), Checker(Checker), SuppressOnSink(SuppressOnSink) {}
48  virtual ~BugType() = default;
49 
50  StringRef getDescription() const { return Description; }
51  StringRef getCategory() const { return Category; }
52  StringRef getCheckerName() const {
53  // FIXME: This is a workaround to ensure that the correct checerk name is
54  // used. The checker names are set after the constructors are run.
55  // In case the BugType object is initialized in the checker's ctor
56  // the CheckerName field will be empty. To circumvent this problem we use
57  // CheckerBase whenever it is possible.
58  StringRef Ret = Checker ? Checker->getCheckerName() : CheckerName;
59  assert(!Ret.empty() && "Checker name is not set properly.");
60  return Ret;
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 };
68 
69 class BuiltinBug : public BugType {
70  const std::string desc;
71  void anchor() override;
72 public:
73  BuiltinBug(class CheckerNameRef checker, const char *name,
74  const char *description)
75  : BugType(checker, name, categories::LogicError), desc(description) {}
76 
77  BuiltinBug(const CheckerBase *checker, const char *name,
78  const char *description)
79  : BugType(checker, name, categories::LogicError), desc(description) {}
80 
81  BuiltinBug(const CheckerBase *checker, const char *name)
82  : BugType(checker, name, categories::LogicError), desc(name) {}
83 
84  StringRef getDescription() const { return desc; }
85 };
86 
87 } // end ento namespace
88 
89 } // end clang namespace
90 #endif
CheckerNameRef getCheckerName() const
Definition: Checker.cpp:25
This wrapper is used to ensure that only StringRefs originating from the CheckerRegistry are used as ...
BugType(const CheckerBase *Checker, StringRef Name, StringRef Cat, bool SuppressOnSink=false)
Definition: BugType.h:44
BuiltinBug(class CheckerNameRef checker, const char *name, const char *description)
Definition: BugType.h:73
StringRef getDescription() const
Definition: BugType.h:84
StringRef getCategory() const
Definition: BugType.h:51
BuiltinBug(const CheckerBase *checker, const char *name)
Definition: BugType.h:81
Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified...
RangeSelector name(std::string ID)
Given a node with a "name", (like NamedDecl, DeclRefExpr or CxxCtorInitializer) selects the name&#39;s to...
BugType(CheckerNameRef CheckerName, StringRef Name, StringRef Cat, bool SuppressOnSink=false)
Definition: BugType.h:40
static bool Ret(InterpState &S, CodePtr &PC, APValue &Result)
Definition: Interp.cpp:34
Dataflow Directional Tag Classes.
StringRef getDescription() const
Definition: BugType.h:50
virtual ~BugType()=default
StringRef getCheckerName() const
Definition: BugType.h:52
bool isSuppressOnSink() const
isSuppressOnSink - Returns true if bug reports associated with this bug type should be suppressed if ...
Definition: BugType.h:66
BuiltinBug(const CheckerBase *checker, const char *name, const char *description)
Definition: BugType.h:77