annotate libsanitizer/ubsan/ubsan_monitor.cpp @ 158:494b0b89df80 default tip

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 25 May 2020 18:13:55 +0900
parents 1830386684a0
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
145
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1 //===-- ubsan_monitor.cpp ---------------------------------------*- C++ -*-===//
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2 //
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
4 // See https://llvm.org/LICENSE.txt for license information.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
6 //
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
7 //===----------------------------------------------------------------------===//
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
8 //
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
9 // Hooks which allow a monitor process to inspect UBSan's diagnostics.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
10 //
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
11 //===----------------------------------------------------------------------===//
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
12
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
13 #include "ubsan_monitor.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
14
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
15 using namespace __ubsan;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
16
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
17 UndefinedBehaviorReport::UndefinedBehaviorReport(const char *IssueKind,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
18 Location &Loc,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
19 InternalScopedString &Msg)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
20 : IssueKind(IssueKind), Loc(Loc), Buffer(Msg.length() + 1) {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
21 // We have the common sanitizer reporting lock, so it's safe to register a
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
22 // new UB report.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
23 RegisterUndefinedBehaviorReport(this);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
24
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
25 // Make a copy of the diagnostic.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
26 Buffer.append("%s", Msg.data());
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
27
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
28 // Let the monitor know that a report is available.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
29 __ubsan_on_report();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
30 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
31
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
32 static UndefinedBehaviorReport *CurrentUBR;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
33
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
34 void __ubsan::RegisterUndefinedBehaviorReport(UndefinedBehaviorReport *UBR) {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
35 CurrentUBR = UBR;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
36 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
37
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
38 SANITIZER_WEAK_DEFAULT_IMPL
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
39 void __ubsan::__ubsan_on_report(void) {}
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
40
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
41 void __ubsan::__ubsan_get_current_report_data(const char **OutIssueKind,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
42 const char **OutMessage,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
43 const char **OutFilename,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
44 unsigned *OutLine,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
45 unsigned *OutCol,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
46 char **OutMemoryAddr) {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
47 if (!OutIssueKind || !OutMessage || !OutFilename || !OutLine || !OutCol ||
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
48 !OutMemoryAddr)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
49 UNREACHABLE("Invalid arguments passed to __ubsan_get_current_report_data");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
50
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
51 InternalScopedString &Buf = CurrentUBR->Buffer;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
52
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
53 // Ensure that the first character of the diagnostic text can't start with a
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
54 // lowercase letter.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
55 char FirstChar = Buf.data()[0];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
56 if (FirstChar >= 'a' && FirstChar <= 'z')
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
57 Buf.data()[0] = FirstChar - 'a' + 'A';
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
58
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
59 *OutIssueKind = CurrentUBR->IssueKind;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
60 *OutMessage = Buf.data();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
61 if (!CurrentUBR->Loc.isSourceLocation()) {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
62 *OutFilename = "<unknown>";
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
63 *OutLine = *OutCol = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
64 } else {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
65 SourceLocation SL = CurrentUBR->Loc.getSourceLocation();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
66 *OutFilename = SL.getFilename();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
67 *OutLine = SL.getLine();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
68 *OutCol = SL.getColumn();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
69 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
70
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
71 if (CurrentUBR->Loc.isMemoryLocation())
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
72 *OutMemoryAddr = (char *)CurrentUBR->Loc.getMemoryLocation();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
73 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
74 *OutMemoryAddr = nullptr;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
75 }