xref: /aosp_15_r20/external/cronet/base/debug/stack_trace_unittest.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2011 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker 
5*6777b538SAndroid Build Coastguard Worker #include <stddef.h>
6*6777b538SAndroid Build Coastguard Worker 
7*6777b538SAndroid Build Coastguard Worker #include <limits>
8*6777b538SAndroid Build Coastguard Worker #include <sstream>
9*6777b538SAndroid Build Coastguard Worker #include <string>
10*6777b538SAndroid Build Coastguard Worker 
11*6777b538SAndroid Build Coastguard Worker #include "base/debug/debugging_buildflags.h"
12*6777b538SAndroid Build Coastguard Worker #include "base/debug/stack_trace.h"
13*6777b538SAndroid Build Coastguard Worker #include "base/immediate_crash.h"
14*6777b538SAndroid Build Coastguard Worker #include "base/logging.h"
15*6777b538SAndroid Build Coastguard Worker #include "base/process/kill.h"
16*6777b538SAndroid Build Coastguard Worker #include "base/process/process_handle.h"
17*6777b538SAndroid Build Coastguard Worker #include "base/profiler/stack_buffer.h"
18*6777b538SAndroid Build Coastguard Worker #include "base/profiler/stack_copier.h"
19*6777b538SAndroid Build Coastguard Worker #include "base/strings/cstring_view.h"
20*6777b538SAndroid Build Coastguard Worker #include "base/test/test_timeouts.h"
21*6777b538SAndroid Build Coastguard Worker #include "build/build_config.h"
22*6777b538SAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest.h"
23*6777b538SAndroid Build Coastguard Worker #include "testing/multiprocess_func_list.h"
24*6777b538SAndroid Build Coastguard Worker 
25*6777b538SAndroid Build Coastguard Worker #include "base/allocator/buildflags.h"
26*6777b538SAndroid Build Coastguard Worker #include "partition_alloc/partition_alloc.h"
27*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(USE_ALLOCATOR_SHIM)
28*6777b538SAndroid Build Coastguard Worker #include "partition_alloc/shim/allocator_shim.h"
29*6777b538SAndroid Build Coastguard Worker #endif
30*6777b538SAndroid Build Coastguard Worker 
31*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_POSIX) && !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_IOS)
32*6777b538SAndroid Build Coastguard Worker #include "base/test/multiprocess_test.h"
33*6777b538SAndroid Build Coastguard Worker #endif
34*6777b538SAndroid Build Coastguard Worker 
35*6777b538SAndroid Build Coastguard Worker namespace base {
36*6777b538SAndroid Build Coastguard Worker namespace debug {
37*6777b538SAndroid Build Coastguard Worker 
38*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_POSIX) && !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_IOS)
39*6777b538SAndroid Build Coastguard Worker typedef MultiProcessTest StackTraceTest;
40*6777b538SAndroid Build Coastguard Worker #else
41*6777b538SAndroid Build Coastguard Worker typedef testing::Test StackTraceTest;
42*6777b538SAndroid Build Coastguard Worker #endif
43*6777b538SAndroid Build Coastguard Worker typedef testing::Test StackTraceDeathTest;
44*6777b538SAndroid Build Coastguard Worker 
45*6777b538SAndroid Build Coastguard Worker #if !defined(__UCLIBC__) && !defined(_AIX)
46*6777b538SAndroid Build Coastguard Worker // StackTrace::OutputToStream() is not implemented under uclibc, nor AIX.
47*6777b538SAndroid Build Coastguard Worker // See https://crbug.com/706728
48*6777b538SAndroid Build Coastguard Worker 
TEST_F(StackTraceTest,OutputToStream)49*6777b538SAndroid Build Coastguard Worker TEST_F(StackTraceTest, OutputToStream) {
50*6777b538SAndroid Build Coastguard Worker   StackTrace trace;
51*6777b538SAndroid Build Coastguard Worker 
52*6777b538SAndroid Build Coastguard Worker   // Dump the trace into a string.
53*6777b538SAndroid Build Coastguard Worker   std::ostringstream os;
54*6777b538SAndroid Build Coastguard Worker   trace.OutputToStream(&os);
55*6777b538SAndroid Build Coastguard Worker   std::string backtrace_message = os.str();
56*6777b538SAndroid Build Coastguard Worker 
57*6777b538SAndroid Build Coastguard Worker   // ToString() should produce the same output.
58*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(backtrace_message, trace.ToString());
59*6777b538SAndroid Build Coastguard Worker 
60*6777b538SAndroid Build Coastguard Worker   span<const void* const> addresses = trace.addresses();
61*6777b538SAndroid Build Coastguard Worker 
62*6777b538SAndroid Build Coastguard Worker #if defined(OFFICIAL_BUILD) && \
63*6777b538SAndroid Build Coastguard Worker     ((BUILDFLAG(IS_POSIX) && !BUILDFLAG(IS_APPLE)) || BUILDFLAG(IS_FUCHSIA))
64*6777b538SAndroid Build Coastguard Worker   // Stack traces require an extra data table that bloats our binaries,
65*6777b538SAndroid Build Coastguard Worker   // so they're turned off for official builds. Stop the test here, so
66*6777b538SAndroid Build Coastguard Worker   // it at least verifies that StackTrace calls don't crash.
67*6777b538SAndroid Build Coastguard Worker   return;
68*6777b538SAndroid Build Coastguard Worker #endif  // defined(OFFICIAL_BUILD) &&
69*6777b538SAndroid Build Coastguard Worker         // ((BUILDFLAG(IS_POSIX) && !BUILDFLAG(IS_APPLE)) ||
70*6777b538SAndroid Build Coastguard Worker         // BUILDFLAG(IS_FUCHSIA))
71*6777b538SAndroid Build Coastguard Worker 
72*6777b538SAndroid Build Coastguard Worker   ASSERT_GT(addresses.size(), 5u) << "Too few frames found.";
73*6777b538SAndroid Build Coastguard Worker   ASSERT_TRUE(addresses[0]);
74*6777b538SAndroid Build Coastguard Worker 
75*6777b538SAndroid Build Coastguard Worker   if (!StackTrace::WillSymbolizeToStreamForTesting())
76*6777b538SAndroid Build Coastguard Worker     return;
77*6777b538SAndroid Build Coastguard Worker 
78*6777b538SAndroid Build Coastguard Worker   // Check if the output has symbol initialization warning.  If it does, fail.
79*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(backtrace_message.find("Dumping unresolved backtrace"),
80*6777b538SAndroid Build Coastguard Worker             std::string::npos)
81*6777b538SAndroid Build Coastguard Worker       << "Unable to resolve symbols.";
82*6777b538SAndroid Build Coastguard Worker 
83*6777b538SAndroid Build Coastguard Worker   // Expect a demangled symbol.
84*6777b538SAndroid Build Coastguard Worker   // Note that Windows Release builds omit the function parameters from the
85*6777b538SAndroid Build Coastguard Worker   // demangled stack output, otherwise this could be "testing::UnitTest::Run()".
86*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(backtrace_message.find("testing::UnitTest::Run") !=
87*6777b538SAndroid Build Coastguard Worker               std::string::npos)
88*6777b538SAndroid Build Coastguard Worker       << "Expected a demangled symbol in backtrace:\n"
89*6777b538SAndroid Build Coastguard Worker       << backtrace_message;
90*6777b538SAndroid Build Coastguard Worker 
91*6777b538SAndroid Build Coastguard Worker   // Expect to at least find main.
92*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(backtrace_message.find("main") != std::string::npos)
93*6777b538SAndroid Build Coastguard Worker       << "Expected to find main in backtrace:\n"
94*6777b538SAndroid Build Coastguard Worker       << backtrace_message;
95*6777b538SAndroid Build Coastguard Worker 
96*6777b538SAndroid Build Coastguard Worker   // Expect to find this function as well.
97*6777b538SAndroid Build Coastguard Worker   // Note: This will fail if not linked with -rdynamic (aka -export_dynamic)
98*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(backtrace_message.find(__func__) != std::string::npos)
99*6777b538SAndroid Build Coastguard Worker       << "Expected to find " << __func__ << " in backtrace:\n"
100*6777b538SAndroid Build Coastguard Worker       << backtrace_message;
101*6777b538SAndroid Build Coastguard Worker }
102*6777b538SAndroid Build Coastguard Worker 
103*6777b538SAndroid Build Coastguard Worker #if !defined(OFFICIAL_BUILD) && !defined(NO_UNWIND_TABLES)
104*6777b538SAndroid Build Coastguard Worker // Disabled in Official builds, where Link-Time Optimization can result in two
105*6777b538SAndroid Build Coastguard Worker // or fewer stack frames being available, causing the test to fail.
TEST_F(StackTraceTest,TruncatedTrace)106*6777b538SAndroid Build Coastguard Worker TEST_F(StackTraceTest, TruncatedTrace) {
107*6777b538SAndroid Build Coastguard Worker   StackTrace trace;
108*6777b538SAndroid Build Coastguard Worker 
109*6777b538SAndroid Build Coastguard Worker   ASSERT_LT(2u, trace.addresses().size());
110*6777b538SAndroid Build Coastguard Worker 
111*6777b538SAndroid Build Coastguard Worker   StackTrace truncated(2);
112*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(2u, truncated.addresses().size());
113*6777b538SAndroid Build Coastguard Worker }
114*6777b538SAndroid Build Coastguard Worker #endif  // !defined(OFFICIAL_BUILD) && !defined(NO_UNWIND_TABLES)
115*6777b538SAndroid Build Coastguard Worker 
116*6777b538SAndroid Build Coastguard Worker // The test is used for manual testing, e.g., to see the raw output.
TEST_F(StackTraceTest,DebugOutputToStream)117*6777b538SAndroid Build Coastguard Worker TEST_F(StackTraceTest, DebugOutputToStream) {
118*6777b538SAndroid Build Coastguard Worker   StackTrace trace;
119*6777b538SAndroid Build Coastguard Worker   std::ostringstream os;
120*6777b538SAndroid Build Coastguard Worker   trace.OutputToStream(&os);
121*6777b538SAndroid Build Coastguard Worker   VLOG(1) << os.str();
122*6777b538SAndroid Build Coastguard Worker }
123*6777b538SAndroid Build Coastguard Worker 
124*6777b538SAndroid Build Coastguard Worker // The test is used for manual testing, e.g., to see the raw output.
TEST_F(StackTraceTest,DebugPrintBacktrace)125*6777b538SAndroid Build Coastguard Worker TEST_F(StackTraceTest, DebugPrintBacktrace) {
126*6777b538SAndroid Build Coastguard Worker   StackTrace().Print();
127*6777b538SAndroid Build Coastguard Worker }
128*6777b538SAndroid Build Coastguard Worker 
129*6777b538SAndroid Build Coastguard Worker // The test is used for manual testing, e.g., to see the raw output.
TEST_F(StackTraceTest,DebugPrintWithPrefixBacktrace)130*6777b538SAndroid Build Coastguard Worker TEST_F(StackTraceTest, DebugPrintWithPrefixBacktrace) {
131*6777b538SAndroid Build Coastguard Worker   StackTrace().PrintWithPrefix("[test]");
132*6777b538SAndroid Build Coastguard Worker }
133*6777b538SAndroid Build Coastguard Worker 
134*6777b538SAndroid Build Coastguard Worker // Make sure nullptr prefix doesn't crash. Output not examined, much
135*6777b538SAndroid Build Coastguard Worker // like the DebugPrintBacktrace test above.
TEST_F(StackTraceTest,DebugPrintWithNullPrefixBacktrace)136*6777b538SAndroid Build Coastguard Worker TEST_F(StackTraceTest, DebugPrintWithNullPrefixBacktrace) {
137*6777b538SAndroid Build Coastguard Worker   StackTrace().PrintWithPrefix({});
138*6777b538SAndroid Build Coastguard Worker }
139*6777b538SAndroid Build Coastguard Worker 
140*6777b538SAndroid Build Coastguard Worker // Test OutputToStreamWithPrefix, mainly to make sure it doesn't
141*6777b538SAndroid Build Coastguard Worker // crash. Any "real" stack trace testing happens above.
TEST_F(StackTraceTest,DebugOutputToStreamWithPrefix)142*6777b538SAndroid Build Coastguard Worker TEST_F(StackTraceTest, DebugOutputToStreamWithPrefix) {
143*6777b538SAndroid Build Coastguard Worker   StackTrace trace;
144*6777b538SAndroid Build Coastguard Worker   cstring_view prefix_string = "[test]";
145*6777b538SAndroid Build Coastguard Worker   std::ostringstream os;
146*6777b538SAndroid Build Coastguard Worker   trace.OutputToStreamWithPrefix(&os, prefix_string);
147*6777b538SAndroid Build Coastguard Worker   std::string backtrace_message = os.str();
148*6777b538SAndroid Build Coastguard Worker 
149*6777b538SAndroid Build Coastguard Worker   // ToStringWithPrefix() should produce the same output.
150*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(backtrace_message, trace.ToStringWithPrefix(prefix_string));
151*6777b538SAndroid Build Coastguard Worker }
152*6777b538SAndroid Build Coastguard Worker 
153*6777b538SAndroid Build Coastguard Worker // Make sure nullptr prefix doesn't crash. Output not examined, much
154*6777b538SAndroid Build Coastguard Worker // like the DebugPrintBacktrace test above.
TEST_F(StackTraceTest,DebugOutputToStreamWithNullPrefix)155*6777b538SAndroid Build Coastguard Worker TEST_F(StackTraceTest, DebugOutputToStreamWithNullPrefix) {
156*6777b538SAndroid Build Coastguard Worker   StackTrace trace;
157*6777b538SAndroid Build Coastguard Worker   std::ostringstream os;
158*6777b538SAndroid Build Coastguard Worker   trace.OutputToStreamWithPrefix(&os, {});
159*6777b538SAndroid Build Coastguard Worker   trace.ToStringWithPrefix({});
160*6777b538SAndroid Build Coastguard Worker }
161*6777b538SAndroid Build Coastguard Worker 
162*6777b538SAndroid Build Coastguard Worker #endif  // !defined(__UCLIBC__) && !defined(_AIX)
163*6777b538SAndroid Build Coastguard Worker 
164*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_POSIX) && !BUILDFLAG(IS_ANDROID)
165*6777b538SAndroid Build Coastguard Worker // Since Mac's base::debug::StackTrace().Print() is not malloc-free, skip
166*6777b538SAndroid Build Coastguard Worker // StackDumpSignalHandlerIsMallocFree if BUILDFLAG(IS_MAC).
167*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(USE_ALLOCATOR_SHIM) && !BUILDFLAG(IS_MAC)
168*6777b538SAndroid Build Coastguard Worker 
169*6777b538SAndroid Build Coastguard Worker namespace {
170*6777b538SAndroid Build Coastguard Worker 
171*6777b538SAndroid Build Coastguard Worker // ImmediateCrash if a signal handler incorrectly uses malloc().
172*6777b538SAndroid Build Coastguard Worker // In an actual implementation, this could cause infinite recursion into the
173*6777b538SAndroid Build Coastguard Worker // signal handler or other problems. Because malloc() is not guaranteed to be
174*6777b538SAndroid Build Coastguard Worker // async signal safe.
BadMalloc(const allocator_shim::AllocatorDispatch *,size_t,void *)175*6777b538SAndroid Build Coastguard Worker void* BadMalloc(const allocator_shim::AllocatorDispatch*, size_t, void*) {
176*6777b538SAndroid Build Coastguard Worker   base::ImmediateCrash();
177*6777b538SAndroid Build Coastguard Worker }
178*6777b538SAndroid Build Coastguard Worker 
BadCalloc(const allocator_shim::AllocatorDispatch *,size_t,size_t,void * context)179*6777b538SAndroid Build Coastguard Worker void* BadCalloc(const allocator_shim::AllocatorDispatch*,
180*6777b538SAndroid Build Coastguard Worker                 size_t,
181*6777b538SAndroid Build Coastguard Worker                 size_t,
182*6777b538SAndroid Build Coastguard Worker                 void* context) {
183*6777b538SAndroid Build Coastguard Worker   base::ImmediateCrash();
184*6777b538SAndroid Build Coastguard Worker }
185*6777b538SAndroid Build Coastguard Worker 
BadAlignedAlloc(const allocator_shim::AllocatorDispatch *,size_t,size_t,void *)186*6777b538SAndroid Build Coastguard Worker void* BadAlignedAlloc(const allocator_shim::AllocatorDispatch*,
187*6777b538SAndroid Build Coastguard Worker                       size_t,
188*6777b538SAndroid Build Coastguard Worker                       size_t,
189*6777b538SAndroid Build Coastguard Worker                       void*) {
190*6777b538SAndroid Build Coastguard Worker   base::ImmediateCrash();
191*6777b538SAndroid Build Coastguard Worker }
192*6777b538SAndroid Build Coastguard Worker 
BadAlignedRealloc(const allocator_shim::AllocatorDispatch *,void *,size_t,size_t,void *)193*6777b538SAndroid Build Coastguard Worker void* BadAlignedRealloc(const allocator_shim::AllocatorDispatch*,
194*6777b538SAndroid Build Coastguard Worker                         void*,
195*6777b538SAndroid Build Coastguard Worker                         size_t,
196*6777b538SAndroid Build Coastguard Worker                         size_t,
197*6777b538SAndroid Build Coastguard Worker                         void*) {
198*6777b538SAndroid Build Coastguard Worker   base::ImmediateCrash();
199*6777b538SAndroid Build Coastguard Worker }
200*6777b538SAndroid Build Coastguard Worker 
BadRealloc(const allocator_shim::AllocatorDispatch *,void *,size_t,void *)201*6777b538SAndroid Build Coastguard Worker void* BadRealloc(const allocator_shim::AllocatorDispatch*,
202*6777b538SAndroid Build Coastguard Worker                  void*,
203*6777b538SAndroid Build Coastguard Worker                  size_t,
204*6777b538SAndroid Build Coastguard Worker                  void*) {
205*6777b538SAndroid Build Coastguard Worker   base::ImmediateCrash();
206*6777b538SAndroid Build Coastguard Worker }
207*6777b538SAndroid Build Coastguard Worker 
BadFree(const allocator_shim::AllocatorDispatch *,void *,void *)208*6777b538SAndroid Build Coastguard Worker void BadFree(const allocator_shim::AllocatorDispatch*, void*, void*) {
209*6777b538SAndroid Build Coastguard Worker   base::ImmediateCrash();
210*6777b538SAndroid Build Coastguard Worker }
211*6777b538SAndroid Build Coastguard Worker 
212*6777b538SAndroid Build Coastguard Worker allocator_shim::AllocatorDispatch g_bad_malloc_dispatch = {
213*6777b538SAndroid Build Coastguard Worker     &BadMalloc,         /* alloc_function */
214*6777b538SAndroid Build Coastguard Worker     &BadMalloc,         /* alloc_unchecked_function */
215*6777b538SAndroid Build Coastguard Worker     &BadCalloc,         /* alloc_zero_initialized_function */
216*6777b538SAndroid Build Coastguard Worker     &BadAlignedAlloc,   /* alloc_aligned_function */
217*6777b538SAndroid Build Coastguard Worker     &BadRealloc,        /* realloc_function */
218*6777b538SAndroid Build Coastguard Worker     &BadFree,           /* free_function */
219*6777b538SAndroid Build Coastguard Worker     nullptr,            /* get_size_estimate_function */
220*6777b538SAndroid Build Coastguard Worker     nullptr,            /* good_size_function */
221*6777b538SAndroid Build Coastguard Worker     nullptr,            /* claimed_address_function */
222*6777b538SAndroid Build Coastguard Worker     nullptr,            /* batch_malloc_function */
223*6777b538SAndroid Build Coastguard Worker     nullptr,            /* batch_free_function */
224*6777b538SAndroid Build Coastguard Worker     nullptr,            /* free_definite_size_function */
225*6777b538SAndroid Build Coastguard Worker     nullptr,            /* try_free_default_function */
226*6777b538SAndroid Build Coastguard Worker     &BadAlignedAlloc,   /* aligned_malloc_function */
227*6777b538SAndroid Build Coastguard Worker     &BadAlignedRealloc, /* aligned_realloc_function */
228*6777b538SAndroid Build Coastguard Worker     &BadFree,           /* aligned_free_function */
229*6777b538SAndroid Build Coastguard Worker     nullptr,            /* next */
230*6777b538SAndroid Build Coastguard Worker };
231*6777b538SAndroid Build Coastguard Worker 
232*6777b538SAndroid Build Coastguard Worker }  // namespace
233*6777b538SAndroid Build Coastguard Worker 
234*6777b538SAndroid Build Coastguard Worker // Regression test for StackDumpSignalHandler async-signal unsafety.
235*6777b538SAndroid Build Coastguard Worker // Since malloc() is not guaranteed to be async signal safe, it is not allowed
236*6777b538SAndroid Build Coastguard Worker // to use malloc() inside StackDumpSignalHandler().
TEST_F(StackTraceDeathTest,StackDumpSignalHandlerIsMallocFree)237*6777b538SAndroid Build Coastguard Worker TEST_F(StackTraceDeathTest, StackDumpSignalHandlerIsMallocFree) {
238*6777b538SAndroid Build Coastguard Worker   EXPECT_DEATH_IF_SUPPORTED(
239*6777b538SAndroid Build Coastguard Worker       [] {
240*6777b538SAndroid Build Coastguard Worker         // On Android, base::debug::EnableInProcessStackDumping() does not
241*6777b538SAndroid Build Coastguard Worker         // change any actions taken by signals to be StackDumpSignalHandler. So
242*6777b538SAndroid Build Coastguard Worker         // the StackDumpSignalHandlerIsMallocFree test doesn't work on Android.
243*6777b538SAndroid Build Coastguard Worker         EnableInProcessStackDumping();
244*6777b538SAndroid Build Coastguard Worker         allocator_shim::InsertAllocatorDispatch(&g_bad_malloc_dispatch);
245*6777b538SAndroid Build Coastguard Worker         // Raise SIGSEGV to invoke StackDumpSignalHandler().
246*6777b538SAndroid Build Coastguard Worker         kill(getpid(), SIGSEGV);
247*6777b538SAndroid Build Coastguard Worker       }(),
248*6777b538SAndroid Build Coastguard Worker       "\\[end of stack trace\\]\n");
249*6777b538SAndroid Build Coastguard Worker }
250*6777b538SAndroid Build Coastguard Worker #endif  // BUILDFLAG(USE_ALLOCATOR_SHIM)
251*6777b538SAndroid Build Coastguard Worker 
252*6777b538SAndroid Build Coastguard Worker namespace {
253*6777b538SAndroid Build Coastguard Worker 
itoa_r_wrapper(intptr_t i,size_t sz,int base,size_t padding)254*6777b538SAndroid Build Coastguard Worker std::string itoa_r_wrapper(intptr_t i, size_t sz, int base, size_t padding) {
255*6777b538SAndroid Build Coastguard Worker   char buffer[1024];
256*6777b538SAndroid Build Coastguard Worker   CHECK_LE(sz, sizeof(buffer));
257*6777b538SAndroid Build Coastguard Worker 
258*6777b538SAndroid Build Coastguard Worker   char* result = internal::itoa_r(i, buffer, sz, base, padding);
259*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(result);
260*6777b538SAndroid Build Coastguard Worker   return std::string(buffer);
261*6777b538SAndroid Build Coastguard Worker }
262*6777b538SAndroid Build Coastguard Worker 
263*6777b538SAndroid Build Coastguard Worker }  // namespace
264*6777b538SAndroid Build Coastguard Worker 
TEST_F(StackTraceTest,itoa_r)265*6777b538SAndroid Build Coastguard Worker TEST_F(StackTraceTest, itoa_r) {
266*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("0", itoa_r_wrapper(0, 128, 10, 0));
267*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("-1", itoa_r_wrapper(-1, 128, 10, 0));
268*6777b538SAndroid Build Coastguard Worker 
269*6777b538SAndroid Build Coastguard Worker   // Test edge cases.
270*6777b538SAndroid Build Coastguard Worker   if (sizeof(intptr_t) == 4) {
271*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ("ffffffff", itoa_r_wrapper(-1, 128, 16, 0));
272*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ("-2147483648",
273*6777b538SAndroid Build Coastguard Worker               itoa_r_wrapper(std::numeric_limits<intptr_t>::min(), 128, 10, 0));
274*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ("2147483647",
275*6777b538SAndroid Build Coastguard Worker               itoa_r_wrapper(std::numeric_limits<intptr_t>::max(), 128, 10, 0));
276*6777b538SAndroid Build Coastguard Worker 
277*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ("80000000",
278*6777b538SAndroid Build Coastguard Worker               itoa_r_wrapper(std::numeric_limits<intptr_t>::min(), 128, 16, 0));
279*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ("7fffffff",
280*6777b538SAndroid Build Coastguard Worker               itoa_r_wrapper(std::numeric_limits<intptr_t>::max(), 128, 16, 0));
281*6777b538SAndroid Build Coastguard Worker   } else if (sizeof(intptr_t) == 8) {
282*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ("ffffffffffffffff", itoa_r_wrapper(-1, 128, 16, 0));
283*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ("-9223372036854775808",
284*6777b538SAndroid Build Coastguard Worker               itoa_r_wrapper(std::numeric_limits<intptr_t>::min(), 128, 10, 0));
285*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ("9223372036854775807",
286*6777b538SAndroid Build Coastguard Worker               itoa_r_wrapper(std::numeric_limits<intptr_t>::max(), 128, 10, 0));
287*6777b538SAndroid Build Coastguard Worker 
288*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ("8000000000000000",
289*6777b538SAndroid Build Coastguard Worker               itoa_r_wrapper(std::numeric_limits<intptr_t>::min(), 128, 16, 0));
290*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ("7fffffffffffffff",
291*6777b538SAndroid Build Coastguard Worker               itoa_r_wrapper(std::numeric_limits<intptr_t>::max(), 128, 16, 0));
292*6777b538SAndroid Build Coastguard Worker   } else {
293*6777b538SAndroid Build Coastguard Worker     ADD_FAILURE() << "Missing test case for your size of intptr_t ("
294*6777b538SAndroid Build Coastguard Worker                   << sizeof(intptr_t) << ")";
295*6777b538SAndroid Build Coastguard Worker   }
296*6777b538SAndroid Build Coastguard Worker 
297*6777b538SAndroid Build Coastguard Worker   // Test hex output.
298*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("688", itoa_r_wrapper(0x688, 128, 16, 0));
299*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("deadbeef", itoa_r_wrapper(0xdeadbeef, 128, 16, 0));
300*6777b538SAndroid Build Coastguard Worker 
301*6777b538SAndroid Build Coastguard Worker   // Check that itoa_r respects passed buffer size limit.
302*6777b538SAndroid Build Coastguard Worker   char buffer[1024];
303*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(internal::itoa_r(0xdeadbeef, buffer, 10, 16, 0));
304*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(internal::itoa_r(0xdeadbeef, buffer, 9, 16, 0));
305*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(internal::itoa_r(0xdeadbeef, buffer, 8, 16, 0));
306*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(internal::itoa_r(0xdeadbeef, buffer, 7, 16, 0));
307*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(internal::itoa_r(0xbeef, buffer, 5, 16, 4));
308*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(internal::itoa_r(0xbeef, buffer, 5, 16, 5));
309*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(internal::itoa_r(0xbeef, buffer, 5, 16, 6));
310*6777b538SAndroid Build Coastguard Worker 
311*6777b538SAndroid Build Coastguard Worker   // Test padding.
312*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("1", itoa_r_wrapper(1, 128, 10, 0));
313*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("1", itoa_r_wrapper(1, 128, 10, 1));
314*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("01", itoa_r_wrapper(1, 128, 10, 2));
315*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("001", itoa_r_wrapper(1, 128, 10, 3));
316*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("0001", itoa_r_wrapper(1, 128, 10, 4));
317*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("00001", itoa_r_wrapper(1, 128, 10, 5));
318*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("688", itoa_r_wrapper(0x688, 128, 16, 0));
319*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("688", itoa_r_wrapper(0x688, 128, 16, 1));
320*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("688", itoa_r_wrapper(0x688, 128, 16, 2));
321*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("688", itoa_r_wrapper(0x688, 128, 16, 3));
322*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("0688", itoa_r_wrapper(0x688, 128, 16, 4));
323*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("00688", itoa_r_wrapper(0x688, 128, 16, 5));
324*6777b538SAndroid Build Coastguard Worker }
325*6777b538SAndroid Build Coastguard Worker #endif  // BUILDFLAG(IS_POSIX) && !BUILDFLAG(IS_ANDROID)
326*6777b538SAndroid Build Coastguard Worker 
327*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(CAN_UNWIND_WITH_FRAME_POINTERS)
328*6777b538SAndroid Build Coastguard Worker 
329*6777b538SAndroid Build Coastguard Worker class CopyFunction : public StackCopier {
330*6777b538SAndroid Build Coastguard Worker  public:
331*6777b538SAndroid Build Coastguard Worker   using StackCopier::CopyStackContentsAndRewritePointers;
332*6777b538SAndroid Build Coastguard Worker };
333*6777b538SAndroid Build Coastguard Worker 
334*6777b538SAndroid Build Coastguard Worker // Copies the current stack segment, starting from the frame pointer of the
335*6777b538SAndroid Build Coastguard Worker // caller frame. Also fills in |stack_end| for the copied stack.
CopyCurrentStackAndRewritePointers(uintptr_t * out_fp,uintptr_t * stack_end)336*6777b538SAndroid Build Coastguard Worker NOINLINE static std::unique_ptr<StackBuffer> CopyCurrentStackAndRewritePointers(
337*6777b538SAndroid Build Coastguard Worker     uintptr_t* out_fp,
338*6777b538SAndroid Build Coastguard Worker     uintptr_t* stack_end) {
339*6777b538SAndroid Build Coastguard Worker   const uint8_t* fp =
340*6777b538SAndroid Build Coastguard Worker       reinterpret_cast<const uint8_t*>(__builtin_frame_address(0));
341*6777b538SAndroid Build Coastguard Worker   uintptr_t original_stack_end = GetStackEnd();
342*6777b538SAndroid Build Coastguard Worker   size_t stack_size = original_stack_end - reinterpret_cast<uintptr_t>(fp);
343*6777b538SAndroid Build Coastguard Worker   auto buffer = std::make_unique<StackBuffer>(stack_size);
344*6777b538SAndroid Build Coastguard Worker   *out_fp = reinterpret_cast<uintptr_t>(
345*6777b538SAndroid Build Coastguard Worker       CopyFunction::CopyStackContentsAndRewritePointers(
346*6777b538SAndroid Build Coastguard Worker           fp, reinterpret_cast<const uintptr_t*>(original_stack_end),
347*6777b538SAndroid Build Coastguard Worker           StackBuffer::kPlatformStackAlignment, buffer->buffer()));
348*6777b538SAndroid Build Coastguard Worker   *stack_end = *out_fp + stack_size;
349*6777b538SAndroid Build Coastguard Worker   return buffer;
350*6777b538SAndroid Build Coastguard Worker }
351*6777b538SAndroid Build Coastguard Worker 
352*6777b538SAndroid Build Coastguard Worker template <size_t Depth>
ExpectStackFramePointers(const void ** frames,size_t max_depth,bool copy_stack)353*6777b538SAndroid Build Coastguard Worker NOINLINE NOOPT void ExpectStackFramePointers(const void** frames,
354*6777b538SAndroid Build Coastguard Worker                                              size_t max_depth,
355*6777b538SAndroid Build Coastguard Worker                                              bool copy_stack) {
356*6777b538SAndroid Build Coastguard Worker code_start:
357*6777b538SAndroid Build Coastguard Worker   // Calling __builtin_frame_address() forces compiler to emit
358*6777b538SAndroid Build Coastguard Worker   // frame pointers, even if they are not enabled.
359*6777b538SAndroid Build Coastguard Worker   EXPECT_NE(nullptr, __builtin_frame_address(0));
360*6777b538SAndroid Build Coastguard Worker   ExpectStackFramePointers<Depth - 1>(frames, max_depth, copy_stack);
361*6777b538SAndroid Build Coastguard Worker 
362*6777b538SAndroid Build Coastguard Worker   constexpr size_t frame_index = Depth - 1;
363*6777b538SAndroid Build Coastguard Worker   const void* frame = frames[frame_index];
364*6777b538SAndroid Build Coastguard Worker   EXPECT_GE(frame, &&code_start) << "For frame at index " << frame_index;
365*6777b538SAndroid Build Coastguard Worker   EXPECT_LE(frame, &&code_end) << "For frame at index " << frame_index;
366*6777b538SAndroid Build Coastguard Worker code_end:
367*6777b538SAndroid Build Coastguard Worker   return;
368*6777b538SAndroid Build Coastguard Worker }
369*6777b538SAndroid Build Coastguard Worker 
370*6777b538SAndroid Build Coastguard Worker template <>
ExpectStackFramePointers(const void ** frames,size_t max_depth,bool copy_stack)371*6777b538SAndroid Build Coastguard Worker NOINLINE NOOPT void ExpectStackFramePointers<1>(const void** frames,
372*6777b538SAndroid Build Coastguard Worker                                                 size_t max_depth,
373*6777b538SAndroid Build Coastguard Worker                                                 bool copy_stack) {
374*6777b538SAndroid Build Coastguard Worker code_start:
375*6777b538SAndroid Build Coastguard Worker   // Calling __builtin_frame_address() forces compiler to emit
376*6777b538SAndroid Build Coastguard Worker   // frame pointers, even if they are not enabled.
377*6777b538SAndroid Build Coastguard Worker   EXPECT_NE(nullptr, __builtin_frame_address(0));
378*6777b538SAndroid Build Coastguard Worker   size_t count = 0;
379*6777b538SAndroid Build Coastguard Worker   if (copy_stack) {
380*6777b538SAndroid Build Coastguard Worker     uintptr_t stack_end = 0, fp = 0;
381*6777b538SAndroid Build Coastguard Worker     std::unique_ptr<StackBuffer> copy =
382*6777b538SAndroid Build Coastguard Worker         CopyCurrentStackAndRewritePointers(&fp, &stack_end);
383*6777b538SAndroid Build Coastguard Worker     count =
384*6777b538SAndroid Build Coastguard Worker         TraceStackFramePointersFromBuffer(fp, stack_end, frames, max_depth, 0);
385*6777b538SAndroid Build Coastguard Worker   } else {
386*6777b538SAndroid Build Coastguard Worker     count = TraceStackFramePointers(frames, max_depth, 0);
387*6777b538SAndroid Build Coastguard Worker   }
388*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(max_depth, count);
389*6777b538SAndroid Build Coastguard Worker 
390*6777b538SAndroid Build Coastguard Worker   const void* frame = frames[0];
391*6777b538SAndroid Build Coastguard Worker   EXPECT_GE(frame, &&code_start) << "For the top frame";
392*6777b538SAndroid Build Coastguard Worker   EXPECT_LE(frame, &&code_end) << "For the top frame";
393*6777b538SAndroid Build Coastguard Worker code_end:
394*6777b538SAndroid Build Coastguard Worker   return;
395*6777b538SAndroid Build Coastguard Worker }
396*6777b538SAndroid Build Coastguard Worker 
397*6777b538SAndroid Build Coastguard Worker #if defined(MEMORY_SANITIZER)
398*6777b538SAndroid Build Coastguard Worker // The test triggers use-of-uninitialized-value errors on MSan bots.
399*6777b538SAndroid Build Coastguard Worker // This is expected because we're walking and reading the stack, and
400*6777b538SAndroid Build Coastguard Worker // sometimes we read fp / pc from the place that previously held
401*6777b538SAndroid Build Coastguard Worker // uninitialized value.
402*6777b538SAndroid Build Coastguard Worker #define MAYBE_TraceStackFramePointers DISABLED_TraceStackFramePointers
403*6777b538SAndroid Build Coastguard Worker #else
404*6777b538SAndroid Build Coastguard Worker #define MAYBE_TraceStackFramePointers TraceStackFramePointers
405*6777b538SAndroid Build Coastguard Worker #endif
TEST_F(StackTraceTest,MAYBE_TraceStackFramePointers)406*6777b538SAndroid Build Coastguard Worker TEST_F(StackTraceTest, MAYBE_TraceStackFramePointers) {
407*6777b538SAndroid Build Coastguard Worker   constexpr size_t kDepth = 5;
408*6777b538SAndroid Build Coastguard Worker   const void* frames[kDepth];
409*6777b538SAndroid Build Coastguard Worker   ExpectStackFramePointers<kDepth>(frames, kDepth, /*copy_stack=*/false);
410*6777b538SAndroid Build Coastguard Worker }
411*6777b538SAndroid Build Coastguard Worker 
412*6777b538SAndroid Build Coastguard Worker // The test triggers use-of-uninitialized-value errors on MSan bots.
413*6777b538SAndroid Build Coastguard Worker // This is expected because we're walking and reading the stack, and
414*6777b538SAndroid Build Coastguard Worker // sometimes we read fp / pc from the place that previously held
415*6777b538SAndroid Build Coastguard Worker // uninitialized value.
416*6777b538SAndroid Build Coastguard Worker // TODO(crbug.com/1132511): Enable this test on Fuchsia.
417*6777b538SAndroid Build Coastguard Worker #if defined(MEMORY_SANITIZER) || BUILDFLAG(IS_FUCHSIA)
418*6777b538SAndroid Build Coastguard Worker #define MAYBE_TraceStackFramePointersFromBuffer \
419*6777b538SAndroid Build Coastguard Worker   DISABLED_TraceStackFramePointersFromBuffer
420*6777b538SAndroid Build Coastguard Worker #else
421*6777b538SAndroid Build Coastguard Worker #define MAYBE_TraceStackFramePointersFromBuffer \
422*6777b538SAndroid Build Coastguard Worker   TraceStackFramePointersFromBuffer
423*6777b538SAndroid Build Coastguard Worker #endif
TEST_F(StackTraceTest,MAYBE_TraceStackFramePointersFromBuffer)424*6777b538SAndroid Build Coastguard Worker TEST_F(StackTraceTest, MAYBE_TraceStackFramePointersFromBuffer) {
425*6777b538SAndroid Build Coastguard Worker   constexpr size_t kDepth = 5;
426*6777b538SAndroid Build Coastguard Worker   const void* frames[kDepth];
427*6777b538SAndroid Build Coastguard Worker   ExpectStackFramePointers<kDepth>(frames, kDepth, /*copy_stack=*/true);
428*6777b538SAndroid Build Coastguard Worker }
429*6777b538SAndroid Build Coastguard Worker 
430*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_APPLE)
431*6777b538SAndroid Build Coastguard Worker #define MAYBE_StackEnd StackEnd
432*6777b538SAndroid Build Coastguard Worker #else
433*6777b538SAndroid Build Coastguard Worker #define MAYBE_StackEnd DISABLED_StackEnd
434*6777b538SAndroid Build Coastguard Worker #endif
435*6777b538SAndroid Build Coastguard Worker 
TEST_F(StackTraceTest,MAYBE_StackEnd)436*6777b538SAndroid Build Coastguard Worker TEST_F(StackTraceTest, MAYBE_StackEnd) {
437*6777b538SAndroid Build Coastguard Worker   EXPECT_NE(0u, GetStackEnd());
438*6777b538SAndroid Build Coastguard Worker }
439*6777b538SAndroid Build Coastguard Worker 
440*6777b538SAndroid Build Coastguard Worker #endif  // BUILDFLAG(CAN_UNWIND_WITH_FRAME_POINTERS)
441*6777b538SAndroid Build Coastguard Worker 
442*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_ANDROID)
443*6777b538SAndroid Build Coastguard Worker 
444*6777b538SAndroid Build Coastguard Worker #if !defined(ADDRESS_SANITIZER) && !defined(UNDEFINED_SANITIZER)
445*6777b538SAndroid Build Coastguard Worker 
446*6777b538SAndroid Build Coastguard Worker #if !defined(ARCH_CPU_ARM_FAMILY)
447*6777b538SAndroid Build Coastguard Worker // On Arm architecture invalid math operations such as division by zero are not
448*6777b538SAndroid Build Coastguard Worker // trapped and do not trigger a SIGFPE.
449*6777b538SAndroid Build Coastguard Worker // Hence disable the test for Arm platforms.
TEST(CheckExitCodeAfterSignalHandlerDeathTest,CheckSIGFPE)450*6777b538SAndroid Build Coastguard Worker TEST(CheckExitCodeAfterSignalHandlerDeathTest, CheckSIGFPE) {
451*6777b538SAndroid Build Coastguard Worker   // Values are volatile to prevent reordering of instructions, i.e. for
452*6777b538SAndroid Build Coastguard Worker   // optimization. Reordering may lead to tests erroneously failing due to
453*6777b538SAndroid Build Coastguard Worker   // SIGFPE being raised outside of EXPECT_EXIT.
454*6777b538SAndroid Build Coastguard Worker   volatile int const nominator = 23;
455*6777b538SAndroid Build Coastguard Worker   volatile int const denominator = 0;
456*6777b538SAndroid Build Coastguard Worker   [[maybe_unused]] volatile int result;
457*6777b538SAndroid Build Coastguard Worker 
458*6777b538SAndroid Build Coastguard Worker   EXPECT_EXIT(result = nominator / denominator,
459*6777b538SAndroid Build Coastguard Worker               ::testing::KilledBySignal(SIGFPE), "");
460*6777b538SAndroid Build Coastguard Worker }
461*6777b538SAndroid Build Coastguard Worker #endif  // !defined(ARCH_CPU_ARM_FAMILY)
462*6777b538SAndroid Build Coastguard Worker 
TEST(CheckExitCodeAfterSignalHandlerDeathTest,CheckSIGSEGV)463*6777b538SAndroid Build Coastguard Worker TEST(CheckExitCodeAfterSignalHandlerDeathTest, CheckSIGSEGV) {
464*6777b538SAndroid Build Coastguard Worker   // Pointee and pointer are volatile to prevent reordering of instructions,
465*6777b538SAndroid Build Coastguard Worker   // i.e. for optimization. Reordering may lead to tests erroneously failing due
466*6777b538SAndroid Build Coastguard Worker   // to SIGSEGV being raised outside of EXPECT_EXIT.
467*6777b538SAndroid Build Coastguard Worker   volatile int* const volatile p_int = nullptr;
468*6777b538SAndroid Build Coastguard Worker 
469*6777b538SAndroid Build Coastguard Worker   EXPECT_EXIT(*p_int = 1234, ::testing::KilledBySignal(SIGSEGV), "");
470*6777b538SAndroid Build Coastguard Worker }
471*6777b538SAndroid Build Coastguard Worker 
472*6777b538SAndroid Build Coastguard Worker #if defined(ARCH_CPU_X86_64)
TEST(CheckExitCodeAfterSignalHandlerDeathTest,CheckSIGSEGVNonCanonicalAddress)473*6777b538SAndroid Build Coastguard Worker TEST(CheckExitCodeAfterSignalHandlerDeathTest,
474*6777b538SAndroid Build Coastguard Worker      CheckSIGSEGVNonCanonicalAddress) {
475*6777b538SAndroid Build Coastguard Worker   // Pointee and pointer are volatile to prevent reordering of instructions,
476*6777b538SAndroid Build Coastguard Worker   // i.e. for optimization. Reordering may lead to tests erroneously failing due
477*6777b538SAndroid Build Coastguard Worker   // to SIGSEGV being raised outside of EXPECT_EXIT.
478*6777b538SAndroid Build Coastguard Worker   //
479*6777b538SAndroid Build Coastguard Worker   // On Linux, the upper half of the address space is reserved by the kernel, so
480*6777b538SAndroid Build Coastguard Worker   // all upper bits must be 0 for canonical addresses.
481*6777b538SAndroid Build Coastguard Worker   volatile int* const volatile p_int =
482*6777b538SAndroid Build Coastguard Worker       reinterpret_cast<int*>(0xabcdabcdabcdabcdULL);
483*6777b538SAndroid Build Coastguard Worker 
484*6777b538SAndroid Build Coastguard Worker   EXPECT_EXIT(*p_int = 1234, ::testing::KilledBySignal(SIGSEGV), "SI_KERNEL");
485*6777b538SAndroid Build Coastguard Worker }
486*6777b538SAndroid Build Coastguard Worker #endif
487*6777b538SAndroid Build Coastguard Worker 
488*6777b538SAndroid Build Coastguard Worker #endif  // #if !defined(ADDRESS_SANITIZER) && !defined(UNDEFINED_SANITIZER)
489*6777b538SAndroid Build Coastguard Worker 
TEST(CheckExitCodeAfterSignalHandlerDeathTest,CheckSIGILL)490*6777b538SAndroid Build Coastguard Worker TEST(CheckExitCodeAfterSignalHandlerDeathTest, CheckSIGILL) {
491*6777b538SAndroid Build Coastguard Worker   auto const raise_sigill = []() {
492*6777b538SAndroid Build Coastguard Worker #if defined(ARCH_CPU_X86_FAMILY)
493*6777b538SAndroid Build Coastguard Worker     asm("ud2");
494*6777b538SAndroid Build Coastguard Worker #elif defined(ARCH_CPU_ARM_FAMILY)
495*6777b538SAndroid Build Coastguard Worker     asm("udf 0");
496*6777b538SAndroid Build Coastguard Worker #else
497*6777b538SAndroid Build Coastguard Worker #error Unsupported platform!
498*6777b538SAndroid Build Coastguard Worker #endif
499*6777b538SAndroid Build Coastguard Worker   };
500*6777b538SAndroid Build Coastguard Worker 
501*6777b538SAndroid Build Coastguard Worker   EXPECT_EXIT(raise_sigill(), ::testing::KilledBySignal(SIGILL), "");
502*6777b538SAndroid Build Coastguard Worker }
503*6777b538SAndroid Build Coastguard Worker 
504*6777b538SAndroid Build Coastguard Worker #endif  // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_ANDROID)
505*6777b538SAndroid Build Coastguard Worker 
506*6777b538SAndroid Build Coastguard Worker }  // namespace debug
507*6777b538SAndroid Build Coastguard Worker }  // namespace base
508