1 //===--- BugType.h - Bug Information Description ---------------*- C++ -*-===//
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
7 //===----------------------------------------------------------------------===//
9 // This file defines BugType, a class representing a bug type.
11 //===----------------------------------------------------------------------===//
13 #ifndef LLVM_CLANG_STATICANALYZER_CORE_BUGREPORTER_BUGTYPE_H
14 #define LLVM_CLANG_STATICANALYZER_CORE_BUGREPORTER_BUGTYPE_H
16 #include "clang/Basic/LLVM.h"
17 #include "clang/StaticAnalyzer/Core/BugReporter/CommonBugCategories.h"
18 #include "clang/StaticAnalyzer/Core/Checker.h"
31 const CheckName Check;
32 const std::string Name;
33 const std::string Category;
34 const CheckerBase *Checker;
37 virtual void anchor();
40 BugType(CheckName Check, StringRef Name, StringRef Cat,
41 bool SuppressOnSink=false)
42 : Check(Check), Name(Name), Category(Cat), Checker(nullptr),
43 SuppressOnSink(SuppressOnSink) {}
44 BugType(const CheckerBase *Checker, StringRef Name, StringRef Cat,
45 bool SuppressOnSink=false)
46 : Check(Checker->getCheckName()), Name(Name), Category(Cat),
47 Checker(Checker), SuppressOnSink(SuppressOnSink) {}
48 virtual ~BugType() = default;
50 StringRef getName() const { return Name; }
51 StringRef getCategory() const { return Category; }
52 StringRef getCheckName() const {
53 // FIXME: This is a workaround to ensure that the correct check name is used
54 // The check names are set after the constructors are run.
55 // In case the BugType object is initialized in the checker's ctor
56 // the Check field will be empty. To circumvent this problem we use
57 // CheckerBase whenever it is possible.
59 Checker ? Checker->getCheckName().getName() : Check.getName();
60 assert(!CheckName.empty() && "Check name is not set properly.");
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
67 bool isSuppressOnSink() const { return SuppressOnSink; }
70 class BuiltinBug : public BugType {
71 const std::string desc;
72 void anchor() override;
74 BuiltinBug(class CheckName check, const char *name, const char *description)
75 : BugType(check, name, categories::LogicError), desc(description) {}
77 BuiltinBug(const CheckerBase *checker, const char *name,
78 const char *description)
79 : BugType(checker, name, categories::LogicError), desc(description) {}
81 BuiltinBug(const CheckerBase *checker, const char *name)
82 : BugType(checker, name, categories::LogicError), desc(name) {}
84 StringRef getDescription() const { return desc; }
87 } // end ento namespace
89 } // end clang namespace