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