Files
clang-p2996/lldb/test/API/functionalities/ubsan/basic/TestUbsanBasic.py
Jim Ingham 852a4bdb25 Change the Sanitizer report breakpoint callbacks to asynchronous.
The synchronous callbacks are not intended to start the target running
during the callback, and doing so is flakey.  This patch converts them
to being regular async callbacks, and adds some testing for sequential
reports that have caused problems in the field.

Differential Revision: https://reviews.llvm.org/D134927
2022-10-03 18:10:28 -07:00

95 lines
3.2 KiB
Python

"""
Tests basic UndefinedBehaviorSanitizer support (detecting an alignment error).
"""
import os
import lldb
from lldbsuite.test.lldbtest import *
from lldbsuite.test.decorators import *
import lldbsuite.test.lldbutil as lldbutil
import json
class UbsanBasicTestCase(TestBase):
@skipUnlessUndefinedBehaviorSanitizer
@no_debug_info_test
def test(self):
self.build()
self.ubsan_tests()
def setUp(self):
# Call super's setUp().
TestBase.setUp(self)
self.line_align = line_number('main.c', '// align line')
def ubsan_tests(self):
# Load the test
exe = self.getBuildArtifact("a.out")
target = self.dbg.CreateTarget(exe)
self.assertTrue(target, VALID_TARGET)
self.registerSanitizerLibrariesWithTarget(target)
self.runCmd("run")
process = self.dbg.GetSelectedTarget().process
thread = process.GetSelectedThread()
frame = thread.GetSelectedFrame()
# the stop reason of the thread should be breakpoint.
self.expect("thread list", "A ubsan issue should be detected",
substrs=['stopped', 'stop reason ='])
stop_reason = thread.GetStopReason()
self.assertStopReason(stop_reason, lldb.eStopReasonInstrumentation)
# test that the UBSan dylib is present
self.expect(
"image lookup -n __ubsan_on_report",
"__ubsan_on_report should be present",
substrs=['1 match found'])
# We should be stopped in __ubsan_on_report
self.assertIn("__ubsan_on_report", frame.GetFunctionName())
# The stopped thread backtrace should contain either 'align line'
found = False
for i in range(thread.GetNumFrames()):
frame = thread.GetFrameAtIndex(i)
if frame.GetLineEntry().GetFileSpec().GetFilename() == "main.c":
if frame.GetLineEntry().GetLine() == self.line_align:
found = True
self.assertTrue(found)
backtraces = thread.GetStopReasonExtendedBacktraces(
lldb.eInstrumentationRuntimeTypeUndefinedBehaviorSanitizer)
self.assertEquals(backtraces.GetSize(), 1)
self.expect(
"thread info -s",
"The extended stop info should contain the UBSan provided fields",
substrs=[
"col",
"description",
"filename",
"instrumentation_class",
"line",
"memory_address",
])
output_lines = self.res.GetOutput().split('\n')
json_line = '\n'.join(output_lines[2:])
data = json.loads(json_line)
self.assertEqual(data["instrumentation_class"], "UndefinedBehaviorSanitizer")
self.assertEqual(data["description"], "misaligned-pointer-use")
self.assertEqual(os.path.basename(data["filename"]), "main.c")
self.assertEqual(data["line"], self.line_align)
for count in range(0,8):
process.Continue()
stop_reason = thread.GetStopReason()
self.assertEqual(stop_reason, lldb.eStopReasonInstrumentation,
"Round {0} wasn't instrumentation".format(count))