199451b44SJordan Rupprecht"""Test reading c-strings from memory via SB API.""" 299451b44SJordan Rupprecht 399451b44SJordan Rupprecht 499451b44SJordan Rupprechtimport os 599451b44SJordan Rupprechtimport lldb 699451b44SJordan Rupprechtfrom lldbsuite.test.decorators import * 799451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import * 899451b44SJordan Rupprechtfrom lldbsuite.test import lldbutil 999451b44SJordan Rupprecht 1099451b44SJordan Rupprecht 1199451b44SJordan Rupprechtclass TestReadMemCString(TestBase): 1299451b44SJordan Rupprecht NO_DEBUG_INFO_TESTCASE = True 1399451b44SJordan Rupprecht 1499451b44SJordan Rupprecht def test_read_memory_c_string(self): 1599451b44SJordan Rupprecht """Test corner case behavior of SBProcess::ReadCStringFromMemory""" 1699451b44SJordan Rupprecht self.build() 1799451b44SJordan Rupprecht self.dbg.SetAsync(False) 1899451b44SJordan Rupprecht 1999451b44SJordan Rupprecht self.main_source = "main.c" 202238dcc3SJonas Devlieghere self.main_source_path = os.path.join(self.getSourceDir(), self.main_source) 2199451b44SJordan Rupprecht self.main_source_spec = lldb.SBFileSpec(self.main_source_path) 2299451b44SJordan Rupprecht self.exe = self.getBuildArtifact("read-mem-cstring") 2399451b44SJordan Rupprecht 2499451b44SJordan Rupprecht (target, process, thread, bkpt) = lldbutil.run_to_source_breakpoint( 252238dcc3SJonas Devlieghere self, "breakpoint here", self.main_source_spec, None, self.exe 262238dcc3SJonas Devlieghere ) 2799451b44SJordan Rupprecht 2899451b44SJordan Rupprecht frame = thread.GetFrameAtIndex(0) 2999451b44SJordan Rupprecht 3099451b44SJordan Rupprecht err = lldb.SBError() 3199451b44SJordan Rupprecht 3299451b44SJordan Rupprecht empty_str_addr = frame.FindVariable("empty_string").GetValueAsUnsigned(err) 33779bbbf2SDave Lee self.assertSuccess(err) 341fb5c7a2SDave Lee self.assertNotEqual(empty_str_addr, lldb.LLDB_INVALID_ADDRESS) 3599451b44SJordan Rupprecht 362238dcc3SJonas Devlieghere one_letter_str_addr = frame.FindVariable( 372238dcc3SJonas Devlieghere "one_letter_string" 382238dcc3SJonas Devlieghere ).GetValueAsUnsigned(err) 39779bbbf2SDave Lee self.assertSuccess(err) 401fb5c7a2SDave Lee self.assertNotEqual(one_letter_str_addr, lldb.LLDB_INVALID_ADDRESS) 4199451b44SJordan Rupprecht 422238dcc3SJonas Devlieghere invalid_memory_str_addr = frame.FindVariable( 432238dcc3SJonas Devlieghere "invalid_memory_string" 442238dcc3SJonas Devlieghere ).GetValueAsUnsigned(err) 45779bbbf2SDave Lee self.assertSuccess(err) 461fb5c7a2SDave Lee self.assertNotEqual(invalid_memory_str_addr, lldb.LLDB_INVALID_ADDRESS) 4799451b44SJordan Rupprecht 4899451b44SJordan Rupprecht # Important: An empty (0-length) c-string must come back as a Python string, not a 4999451b44SJordan Rupprecht # None object. 5099451b44SJordan Rupprecht empty_str = process.ReadCStringFromMemory(empty_str_addr, 2048, err) 51779bbbf2SDave Lee self.assertSuccess(err) 52619e2e09SDave Lee self.assertEqual(empty_str, "") 5399451b44SJordan Rupprecht 542238dcc3SJonas Devlieghere one_letter_string = process.ReadCStringFromMemory( 552238dcc3SJonas Devlieghere one_letter_str_addr, 2048, err 562238dcc3SJonas Devlieghere ) 57779bbbf2SDave Lee self.assertSuccess(err) 58619e2e09SDave Lee self.assertEqual(one_letter_string, "1") 5999451b44SJordan Rupprecht 602238dcc3SJonas Devlieghere invalid_memory_string = process.ReadCStringFromMemory( 612238dcc3SJonas Devlieghere invalid_memory_str_addr, 2048, err 622238dcc3SJonas Devlieghere ) 6399451b44SJordan Rupprecht self.assertTrue(err.Fail()) 64*58611451SEisuke Kawashima self.assertTrue(invalid_memory_string == "" or invalid_memory_string is None) 65