Coverage Report

Created: 2018-09-23 03:40

/Users/buildslave/jenkins/workspace/clang-stage2-coverage-R/llvm/tools/clang/include/clang/StaticAnalyzer/Core/BugReporter/BugType.h
Line
Count
Source
1
//===---  BugType.h - Bug Information Description ---------------*- 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
22
namespace clang {
23
24
namespace ento {
25
26
class BugReporter;
27
class ExplodedNode;
28
class ExprEngine;
29
30
class BugType {
31
private:
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
40
public:
41
  BugType(CheckName Check, StringRef Name, StringRef Cat)
42
      : Check(Check), Name(Name), Category(Cat), Checker(nullptr),
43
712
        SuppressOnSink(false) {}
44
  BugType(const CheckerBase *Checker, StringRef Name, StringRef Cat)
45
      : Check(Checker->getCheckName()), Name(Name), Category(Cat),
46
994
        Checker(Checker), SuppressOnSink(false) {}
47
1.70k
  virtual ~BugType() = default;
48
49
10.5k
  StringRef getName() const { return Name; }
50
10.5k
  StringRef getCategory() const { return Category; }
51
10.5k
  StringRef getCheckName() const {
52
10.5k
    // FIXME: This is a workaround to ensure that the correct check name is used
53
10.5k
    // The check names are set after the constructors are run.
54
10.5k
    // In case the BugType object is initialized in the checker's ctor
55
10.5k
    // the Check field will be empty. To circumvent this problem we use
56
10.5k
    // CheckerBase whenever it is possible.
57
10.5k
    StringRef CheckName =
58
10.5k
        Checker ? 
Checker->getCheckName().getName()8.66k
:
Check.getName()1.84k
;
59
10.5k
    assert(!CheckName.empty() && "Check name is not set properly.");
60
10.5k
    return CheckName;
61
10.5k
  }
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
10.0k
  bool isSuppressOnSink() const { return SuppressOnSink; }
67
116
  void setSuppressOnSink(bool x) { SuppressOnSink = x; }
68
};
69
70
class BuiltinBug : public BugType {
71
  const std::string desc;
72
  void anchor() override;
73
public:
74
  BuiltinBug(class CheckName check, const char *name, const char *description)
75
29
      : BugType(check, name, categories::LogicError), desc(description) {}
76
77
  BuiltinBug(const CheckerBase *checker, const char *name,
78
             const char *description)
79
40
      : BugType(checker, name, categories::LogicError), desc(description) {}
80
81
  BuiltinBug(const CheckerBase *checker, const char *name)
82
389
      : BugType(checker, name, categories::LogicError), desc(name) {}
83
84
182
  StringRef getDescription() const { return desc; }
85
};
86
87
} // end ento namespace
88
89
} // end clang namespace
90
#endif