1 //===---------- IssueHash.h - Generate identification hashes ----*- 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 #ifndef LLVM_CLANG_STATICANALYZER_CORE_ISSUE_HASH_H
9 #define LLVM_CLANG_STATICANALYZER_CORE_ISSUE_HASH_H
10 
11 #include "llvm/ADT/SmallString.h"
12 
13 namespace clang {
14 class Decl;
15 class FullSourceLoc;
16 class LangOptions;
17 
18 /// Returns an opaque identifier for a diagnostic.
19 ///
20 /// This opaque identifier is intended to be stable even when the source code
21 /// is changed. It allows to track diagnostics in the long term, for example,
22 /// find which diagnostics are "new", maintain a database of suppressed
23 /// diagnostics etc.
24 ///
25 /// We may introduce more variants of issue hashes in the future
26 /// but older variants will still be available for compatibility.
27 ///
28 /// This hash is based on the following information:
29 ///   - Name of the checker that emitted the diagnostic.
30 ///   - Warning message.
31 ///   - Name of the enclosing declaration.
32 ///   - Contents of the line of code with the issue, excluding whitespace.
33 ///   - Column number (but not the line number! - which makes it stable).
34 llvm::SmallString<32> getIssueHash(const FullSourceLoc &IssueLoc,
35                                    llvm::StringRef CheckerName,
36                                    llvm::StringRef WarningMessage,
37                                    const Decl *IssueDecl,
38                                    const LangOptions &LangOpts);
39 
40 /// Get the unhashed string representation of the V1 issue hash.
41 /// When hashed, it becomes the actual issue hash. Useful for testing.
42 /// See GetIssueHashV1() for more information.
43 std::string getIssueString(const FullSourceLoc &IssueLoc,
44                            llvm::StringRef CheckerName,
45                            llvm::StringRef WarningMessage,
46                            const Decl *IssueDecl, const LangOptions &LangOpts);
47 } // namespace clang
48 
49 #endif
50