Coverage Report

Created: 2019-02-23 12:57

/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
// 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
class ExplodedNode;
27
class ExprEngine;
28
29
class BugType {
30
private:
31
  const CheckName Check;
32
  const std::string Name;
33
  const std::string Category;
34
  const CheckerBase *Checker;
35
  bool SuppressOnSink;
36
37
  virtual void anchor();
38
39
public:
40
  BugType(CheckName Check, StringRef Name, StringRef Cat,
41
          bool SuppressOnSink=false)
42
      : Check(Check), Name(Name), Category(Cat), Checker(nullptr),
43
924
        SuppressOnSink(SuppressOnSink) {}
44
  BugType(const CheckerBase *Checker, StringRef Name, StringRef Cat,
45
          bool SuppressOnSink=false)
46
      : Check(Checker->getCheckName()), Name(Name), Category(Cat),
47
1.58k
        Checker(Checker), SuppressOnSink(SuppressOnSink) {}
48
2.50k
  virtual ~BugType() = default;
49
50
11.3k
  StringRef getName() const { return Name; }
51
11.3k
  StringRef getCategory() const { return Category; }
52
11.3k
  StringRef getCheckName() const {
53
11.3k
    // FIXME: This is a workaround to ensure that the correct check name is used
54
11.3k
    // The check names are set after the constructors are run.
55
11.3k
    // In case the BugType object is initialized in the checker's ctor
56
11.3k
    // the Check field will be empty. To circumvent this problem we use
57
11.3k
    // CheckerBase whenever it is possible.
58
11.3k
    StringRef CheckName =
59
11.3k
        Checker ? 
Checker->getCheckName().getName()9.18k
:
Check.getName()2.13k
;
60
11.3k
    assert(!CheckName.empty() && "Check name is not set properly.");
61
11.3k
    return CheckName;
62
11.3k
  }
63
64
  /// isSuppressOnSink - Returns true if bug reports associated with this bug
65
  ///  type should be suppressed if the end node of the report is post-dominated
66
  ///  by a sink node.
67
10.8k
  bool isSuppressOnSink() const { return SuppressOnSink; }
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
41
      : BugType(checker, name, categories::LogicError), desc(description) {}
80
81
  BuiltinBug(const CheckerBase *checker, const char *name)
82
405
      : BugType(checker, name, categories::LogicError), desc(name) {}
83
84
234
  StringRef getDescription() const { return desc; }
85
};
86
87
} // end ento namespace
88
89
} // end clang namespace
90
#endif