]>
Commit | Line | Data |
---|---|---|
1a4d82fc JJ |
1 | //===-- SpecialCaseList.h - special case list for sanitizers ----*- 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 | // This is a utility class used to parse user-provided text files with | |
10 | // "special case lists" for code sanitizers. Such files are used to | |
11 | // define "ABI list" for DataFlowSanitizer and blacklists for another sanitizers | |
12 | // like AddressSanitizer or UndefinedBehaviorSanitizer. | |
13 | // | |
14 | // Empty lines and lines starting with "#" are ignored. All the rest lines | |
15 | // should have the form: | |
16 | // section:wildcard_expression[=category] | |
17 | // If category is not specified, it is assumed to be empty string. | |
18 | // Definitions of "section" and "category" are sanitizer-specific. For example, | |
19 | // sanitizer blacklists support sections "src", "fun" and "global". | |
20 | // Wildcard expressions define, respectively, source files, functions or | |
21 | // globals which shouldn't be instrumented. | |
22 | // Examples of categories: | |
23 | // "functional": used in DFSan to list functions with pure functional | |
24 | // semantics. | |
25 | // "init": used in ASan blacklist to disable initialization-order bugs | |
26 | // detection for certain globals or source files. | |
27 | // Full special case list file example: | |
28 | // --- | |
29 | // # Blacklisted items: | |
30 | // fun:*_ZN4base6subtle* | |
31 | // global:*global_with_bad_access_or_initialization* | |
32 | // global:*global_with_initialization_issues*=init | |
33 | // type:*Namespace::ClassName*=init | |
34 | // src:file_with_tricky_code.cc | |
35 | // src:ignore-global-initializers-issues.cc=init | |
36 | // | |
37 | // # Functions with pure functional semantics: | |
38 | // fun:cos=functional | |
39 | // fun:sin=functional | |
40 | // --- | |
41 | // Note that the wild card is in fact an llvm::Regex, but * is automatically | |
42 | // replaced with .* | |
43 | // This is similar to the "ignore" feature of ThreadSanitizer. | |
44 | // http://code.google.com/p/data-race-test/wiki/ThreadSanitizerIgnores | |
45 | // | |
46 | //===----------------------------------------------------------------------===// | |
47 | ||
48 | #ifndef LLVM_SUPPORT_SPECIALCASELIST_H | |
49 | #define LLVM_SUPPORT_SPECIALCASELIST_H | |
50 | ||
51 | #include "llvm/ADT/StringMap.h" | |
52 | ||
53 | namespace llvm { | |
54 | class MemoryBuffer; | |
55 | class Regex; | |
56 | class StringRef; | |
57 | ||
58 | class SpecialCaseList { | |
59 | public: | |
60 | /// Parses the special case list from a file. If Path is empty, returns | |
61 | /// an empty special case list. On failure, returns 0 and writes an error | |
62 | /// message to string. | |
63 | static std::unique_ptr<SpecialCaseList> create(StringRef Path, | |
64 | std::string &Error); | |
65 | /// Parses the special case list from a memory buffer. On failure, returns | |
66 | /// 0 and writes an error message to string. | |
67 | static std::unique_ptr<SpecialCaseList> create(const MemoryBuffer *MB, | |
68 | std::string &Error); | |
69 | /// Parses the special case list from a file. On failure, reports a fatal | |
70 | /// error. | |
71 | static std::unique_ptr<SpecialCaseList> createOrDie(StringRef Path); | |
72 | ||
73 | ~SpecialCaseList(); | |
74 | ||
75 | /// Returns true, if special case list contains a line | |
76 | /// \code | |
77 | /// @Section:<E>=@Category | |
78 | /// \endcode | |
79 | /// and @Query satisfies a wildcard expression <E>. | |
80 | bool inSection(StringRef Section, StringRef Query, | |
81 | StringRef Category = StringRef()) const; | |
82 | ||
83 | private: | |
84 | SpecialCaseList(SpecialCaseList const &) LLVM_DELETED_FUNCTION; | |
85 | SpecialCaseList &operator=(SpecialCaseList const &) LLVM_DELETED_FUNCTION; | |
86 | ||
87 | struct Entry; | |
88 | StringMap<StringMap<Entry> > Entries; | |
89 | ||
90 | SpecialCaseList(); | |
91 | /// Parses just-constructed SpecialCaseList entries from a memory buffer. | |
92 | bool parse(const MemoryBuffer *MB, std::string &Error); | |
93 | }; | |
94 | ||
95 | } // namespace llvm | |
96 | ||
97 | #endif // LLVM_SUPPORT_SPECIALCASELIST_H | |
98 |