199451b44SJordan Rupprecht""" 299451b44SJordan RupprechtTests basic UndefinedBehaviorSanitizer support (detecting an alignment error). 399451b44SJordan Rupprecht""" 499451b44SJordan Rupprecht 599451b44SJordan Rupprechtimport os 699451b44SJordan Rupprechtimport lldb 799451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import * 899451b44SJordan Rupprechtfrom lldbsuite.test.decorators import * 999451b44SJordan Rupprechtimport lldbsuite.test.lldbutil as lldbutil 1099451b44SJordan Rupprechtimport json 1199451b44SJordan Rupprecht 1299451b44SJordan Rupprecht 1399451b44SJordan Rupprechtclass UbsanBasicTestCase(TestBase): 1499451b44SJordan Rupprecht @skipUnlessUndefinedBehaviorSanitizer 155f2e8f57SJonas Devlieghere @no_debug_info_test 1699451b44SJordan Rupprecht def test(self): 1799451b44SJordan Rupprecht self.build() 1899451b44SJordan Rupprecht self.ubsan_tests() 1999451b44SJordan Rupprecht 2099451b44SJordan Rupprecht def setUp(self): 2199451b44SJordan Rupprecht # Call super's setUp(). 2299451b44SJordan Rupprecht TestBase.setUp(self) 232238dcc3SJonas Devlieghere self.line_align = line_number("main.c", "// align line") 2499451b44SJordan Rupprecht 2599451b44SJordan Rupprecht def ubsan_tests(self): 2699451b44SJordan Rupprecht # Load the test 2799451b44SJordan Rupprecht exe = self.getBuildArtifact("a.out") 283a538de6SJonas Devlieghere target = self.dbg.CreateTarget(exe) 293a538de6SJonas Devlieghere self.assertTrue(target, VALID_TARGET) 303a538de6SJonas Devlieghere self.registerSanitizerLibrariesWithTarget(target) 3199451b44SJordan Rupprecht 3299451b44SJordan Rupprecht self.runCmd("run") 3399451b44SJordan Rupprecht 3499451b44SJordan Rupprecht process = self.dbg.GetSelectedTarget().process 3599451b44SJordan Rupprecht thread = process.GetSelectedThread() 3699451b44SJordan Rupprecht frame = thread.GetSelectedFrame() 3799451b44SJordan Rupprecht 3899451b44SJordan Rupprecht # the stop reason of the thread should be breakpoint. 392238dcc3SJonas Devlieghere self.expect( 402238dcc3SJonas Devlieghere "thread list", 412238dcc3SJonas Devlieghere "A ubsan issue should be detected", 422238dcc3SJonas Devlieghere substrs=["stopped", "stop reason ="], 432238dcc3SJonas Devlieghere ) 4499451b44SJordan Rupprecht 4599451b44SJordan Rupprecht stop_reason = thread.GetStopReason() 460f821339SJonas Devlieghere self.assertStopReason(stop_reason, lldb.eStopReasonInstrumentation) 4799451b44SJordan Rupprecht 4899451b44SJordan Rupprecht # test that the UBSan dylib is present 4999451b44SJordan Rupprecht self.expect( 5099451b44SJordan Rupprecht "image lookup -n __ubsan_on_report", 5199451b44SJordan Rupprecht "__ubsan_on_report should be present", 522238dcc3SJonas Devlieghere substrs=["1 match found"], 532238dcc3SJonas Devlieghere ) 5499451b44SJordan Rupprecht 5599451b44SJordan Rupprecht # We should be stopped in __ubsan_on_report 563cc37622SDave Lee self.assertIn("__ubsan_on_report", frame.GetFunctionName()) 5799451b44SJordan Rupprecht 5899451b44SJordan Rupprecht # The stopped thread backtrace should contain either 'align line' 5999451b44SJordan Rupprecht found = False 6099451b44SJordan Rupprecht for i in range(thread.GetNumFrames()): 6199451b44SJordan Rupprecht frame = thread.GetFrameAtIndex(i) 6299451b44SJordan Rupprecht if frame.GetLineEntry().GetFileSpec().GetFilename() == "main.c": 6399451b44SJordan Rupprecht if frame.GetLineEntry().GetLine() == self.line_align: 6499451b44SJordan Rupprecht found = True 6599451b44SJordan Rupprecht self.assertTrue(found) 6699451b44SJordan Rupprecht 6799451b44SJordan Rupprecht backtraces = thread.GetStopReasonExtendedBacktraces( 682238dcc3SJonas Devlieghere lldb.eInstrumentationRuntimeTypeUndefinedBehaviorSanitizer 692238dcc3SJonas Devlieghere ) 70*80fcecb1SJonas Devlieghere self.assertEqual(backtraces.GetSize(), 1) 7199451b44SJordan Rupprecht 7299451b44SJordan Rupprecht self.expect( 7399451b44SJordan Rupprecht "thread info -s", 7499451b44SJordan Rupprecht "The extended stop info should contain the UBSan provided fields", 7599451b44SJordan Rupprecht substrs=[ 7699451b44SJordan Rupprecht "col", 7799451b44SJordan Rupprecht "description", 7899451b44SJordan Rupprecht "filename", 7999451b44SJordan Rupprecht "instrumentation_class", 8099451b44SJordan Rupprecht "line", 8199451b44SJordan Rupprecht "memory_address", 822238dcc3SJonas Devlieghere ], 832238dcc3SJonas Devlieghere ) 8499451b44SJordan Rupprecht 852238dcc3SJonas Devlieghere output_lines = self.res.GetOutput().split("\n") 862238dcc3SJonas Devlieghere json_line = "\n".join(output_lines[2:]) 8799451b44SJordan Rupprecht data = json.loads(json_line) 8899451b44SJordan Rupprecht 8999451b44SJordan Rupprecht self.assertEqual(data["instrumentation_class"], "UndefinedBehaviorSanitizer") 9099451b44SJordan Rupprecht self.assertEqual(data["description"], "misaligned-pointer-use") 9199451b44SJordan Rupprecht self.assertEqual(os.path.basename(data["filename"]), "main.c") 9299451b44SJordan Rupprecht self.assertEqual(data["line"], self.line_align) 9399451b44SJordan Rupprecht 94852a4bdbSJim Ingham for count in range(0, 8): 95852a4bdbSJim Ingham process.Continue() 96852a4bdbSJim Ingham stop_reason = thread.GetStopReason() 972238dcc3SJonas Devlieghere self.assertEqual( 982238dcc3SJonas Devlieghere stop_reason, 992238dcc3SJonas Devlieghere lldb.eStopReasonInstrumentation, 1002238dcc3SJonas Devlieghere "Round {0} wasn't instrumentation".format(count), 1012238dcc3SJonas Devlieghere ) 102