Coverage Report

Created: 2022-05-17 06:19

/Users/buildslave/jenkins/workspace/coverage/llvm-project/clang/include/clang/StaticAnalyzer/Core/BugReporter/BugType.h
Line
Count
Source (jump to first uncovered line)
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
21
namespace clang {
22
23
namespace ento {
24
25
class BugReporter;
26
27
class BugType {
28
private:
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
37
public:
38
  BugType(CheckerNameRef CheckerName, StringRef Name, StringRef Cat,
39
          bool SuppressOnSink = false)
40
      : CheckerName(CheckerName), Description(Name), Category(Cat),
41
2.35k
        Checker(nullptr), SuppressOnSink(SuppressOnSink) {}
42
  BugType(const CheckerBase *Checker, StringRef Name, StringRef Cat,
43
          bool SuppressOnSink = false)
44
      : CheckerName(Checker->getCheckerName()), Description(Name),
45
4.15k
        Category(Cat), Checker(Checker), SuppressOnSink(SuppressOnSink) {}
46
6.51k
  virtual ~BugType() = default;
47
48
38.8k
  StringRef getDescription() const { return Description; }
49
37.9k
  StringRef getCategory() const { return Category; }
50
84.3k
  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
84.3k
    StringRef Ret = Checker ? 
Checker->getCheckerName()71.4k
:
CheckerName12.9k
;
57
84.3k
    assert(!Ret.empty() && "Checker name is not set properly.");
58
0
    return Ret;
59
84.3k
  }
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
18.9k
  bool isSuppressOnSink() const { return SuppressOnSink; }
65
};
66
67
class BuiltinBug : public BugType {
68
  const std::string desc;
69
  void anchor() override;
70
public:
71
  BuiltinBug(class CheckerNameRef checker, const char *name,
72
             const char *description)
73
42
      : BugType(checker, name, categories::LogicError), desc(description) {}
74
75
  BuiltinBug(const CheckerBase *checker, const char *name,
76
             const char *description)
77
38
      : BugType(checker, name, categories::LogicError), desc(description) {}
78
79
  BuiltinBug(class CheckerNameRef checker, const char *name)
80
135
      : BugType(checker, name, categories::LogicError), desc(name) {}
81
82
  BuiltinBug(const CheckerBase *checker, const char *name)
83
515
      : BugType(checker, name, categories::LogicError), desc(name) {}
84
85
199
  StringRef getDescription() const { return desc; }
86
};
87
88
} // namespace ento
89
90
} // end clang namespace
91
#endif