1"""
2Test that hitting a UBSan issue while running user expression doesn't break the evaluation.
3"""
4
5import lldb
6from lldbsuite.test.lldbtest import *
7from lldbsuite.test.decorators import *
8import lldbsuite.test.lldbutil as lldbutil
9
10
11class UbsanUserExpressionTestCase(TestBase):
12
13    mydir = TestBase.compute_mydir(__file__)
14
15    @skipUnlessUndefinedBehaviorSanitizer
16    def test(self):
17        self.build()
18        self.ubsan_tests()
19
20    def setUp(self):
21        # Call super's setUp().
22        TestBase.setUp(self)
23        self.line_breakpoint = line_number('main.c', '// breakpoint line')
24
25    def ubsan_tests(self):
26        # Load the test
27        exe = self.getBuildArtifact("a.out")
28        target = self.dbg.CreateTarget(exe)
29        self.assertTrue(target, VALID_TARGET)
30        self.registerSanitizerLibrariesWithTarget(target)
31
32        self.runCmd("breakpoint set -f main.c -l %d" % self.line_breakpoint)
33
34        self.runCmd("run")
35
36        process = self.dbg.GetSelectedTarget().process
37        thread = process.GetSelectedThread()
38        frame = thread.GetSelectedFrame()
39
40        self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT,
41                    substrs=['stopped', 'stop reason = breakpoint'])
42
43        self.expect("p foo()", substrs=["(int) $0 = 42"])
44
45        self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT,
46                    substrs=['stopped', 'stop reason = breakpoint'])
47