xref: /llvm-project/lldb/test/API/functionalities/ubsan/basic/TestUbsanBasic.py (revision 80fcecb13c388ff087a27a4b0e7ca3dd8c98eaa4)
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