File: CrashAnnotations.h.in

package info (click to toggle)
firefox 144.0-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 4,637,504 kB
  • sloc: cpp: 7,576,692; javascript: 6,430,831; ansic: 3,748,119; python: 1,398,978; xml: 628,810; asm: 438,679; java: 186,194; sh: 63,212; makefile: 19,159; objc: 13,086; perl: 12,986; yacc: 4,583; cs: 3,846; pascal: 3,448; lex: 1,720; ruby: 1,003; exp: 762; php: 436; lisp: 258; awk: 247; sql: 66; sed: 53; csh: 10
file content (143 lines) | stat: -rw-r--r-- 4,084 bytes parent folder | download | duplicates (12)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

#ifndef CrashAnnotations_h
#define CrashAnnotations_h

#include <cstddef>
#include <cstdint>

#include "mozilla/Maybe.h"
#include "nsStringFwd.h"

namespace CrashReporter {

using mozilla::Maybe;

// Typed enum representing all crash annotations
enum class Annotation : uint32_t {
${enum}
};

// Stringified crash annotation names
const char* const kAnnotationStrings[] = {
${strings}
};

// Type of each annotation
enum class AnnotationType : uint8_t {
  String = 0,   // Any type of string, const char*, nsCString, etc...
  Boolean = 1,  // Stored as a byte
  U32 = 2,      // C/C++'s uint32_t or Rust's u32
  U64 = 3,      // C/C++'s uint64_t or Rust's u64
  USize = 4,    // C/C++'s size_t or Rust's usize
  Object = 5,   // Not able to be read/written from the C++ API.
};

// Type of each annotation
const AnnotationType kAnnotationTypes[] = {
${types}
};

// Allowlist of crash annotations that can be included in a crash ping
const Annotation kCrashPingAllowedList[] = {
${pingallowedlist}
};

// Allowlist of crash annotations that can be included in a crash report
// (excludes those in kCrashPingAllowedList).
const Annotation kCrashReportAllowedList[] = {
${reportallowedlist}
};

// Annotations which should be skipped when they have specific values
struct AnnotationSkipValue {
  Annotation annotation;
  const char* value;
};

const AnnotationSkipValue kSkipIfList[] = {
${skiplist}
};

/**
 * Return the type of a crash annotation.
 *
 * @param aAnnotation a crash annotation
 * @returns The type of this annotation
 */
static inline AnnotationType TypeOfAnnotation(Annotation aAnnotation) {
  return kAnnotationTypes[static_cast<uint32_t>(aAnnotation)];
}

/**
 * Return the string representation of a crash annotation.
 *
 * @param aAnnotation a crash annotation
 * @returns A constant string holding the annotation name
 */
static inline const char* AnnotationToString(Annotation aAnnotation) {
  return kAnnotationStrings[static_cast<uint32_t>(aAnnotation)];
}

/**
 * Converts a string to its corresponding crash annotation.
 *
 * @param aValue the string to be converted
 * @return the annotation corresponding to the string or nothing
 */
Maybe<Annotation> AnnotationFromString(const nsACString& aValue);

/**
 * Checks if the given crash annotation is allowed for inclusion in a crash
 * ping.
 *
 * @param aAnnotation the crash annotation to be checked
 * @return true if the annotation can be included in a crash ping, false
 *         otherwise
 */
bool IsAnnotationAllowedForPing(Annotation aAnnotation);

/**
 * Checks if the given crash annotation is allowed for inclusion in a crash
 * report.
 *
 * @param aAnnotation the crash annotation to be checked
 * @return true if the annotation can be included in a crash report, false
 *         otherwise
 */
bool IsAnnotationAllowedForReport(Annotation aAnnotation);

/**
 * Checks if the annotation should be included. Some annotations are skipped if
 * their value matches a specific one (like the value 0).
 *
 * @param aAnnotation the crash annotation to be checked
 * @param aValue the contents of the annotation as a string
 * @return true if the annotation should be included, false otherwise
 */
bool ShouldIncludeAnnotation(Annotation aAnnotation, const char* aValue);

/**
 * Abstract annotation writer, this is needed only for code that writes out
 * annotations in the exception handler.
 */
class AnnotationWriter {
 public:
  virtual void Write(Annotation aAnnotation, const char* aValue,
                     size_t aLen = 0) = 0;
  virtual void Write(Annotation aAnnotation, bool aValue) = 0;
  virtual void Write(Annotation aAnnotation, uint64_t aValue) = 0;
};

#ifdef XP_WIN

extern void RecordDllAnnotations(bool* aBlocklistInitFailed,
                                 bool* aUser32BeforeBlocklist);

#endif  // XP_WIN

}  // namespace CrashReporter

#endif  // CrashAnnotations_h