"""Test reading c-strings from memory via SB API.""" import os import lldb from lldbsuite.test.decorators import * from lldbsuite.test.lldbtest import * from lldbsuite.test import lldbutil class TestReadMemCString(TestBase): NO_DEBUG_INFO_TESTCASE = True def test_read_memory_c_string(self): """Test corner case behavior of SBProcess::ReadCStringFromMemory""" self.build() self.dbg.SetAsync(False) self.main_source = "main.c" self.main_source_path = os.path.join(self.getSourceDir(), self.main_source) self.main_source_spec = lldb.SBFileSpec(self.main_source_path) self.exe = self.getBuildArtifact("read-mem-cstring") (target, process, thread, bkpt) = lldbutil.run_to_source_breakpoint( self, "breakpoint here", self.main_source_spec, None, self.exe ) frame = thread.GetFrameAtIndex(0) err = lldb.SBError() empty_str_addr = frame.FindVariable("empty_string").GetValueAsUnsigned(err) self.assertSuccess(err) self.assertNotEqual(empty_str_addr, lldb.LLDB_INVALID_ADDRESS) one_letter_str_addr = frame.FindVariable( "one_letter_string" ).GetValueAsUnsigned(err) self.assertSuccess(err) self.assertNotEqual(one_letter_str_addr, lldb.LLDB_INVALID_ADDRESS) invalid_memory_str_addr = frame.FindVariable( "invalid_memory_string" ).GetValueAsUnsigned(err) self.assertSuccess(err) self.assertNotEqual(invalid_memory_str_addr, lldb.LLDB_INVALID_ADDRESS) # Important: An empty (0-length) c-string must come back as a Python string, not a # None object. empty_str = process.ReadCStringFromMemory(empty_str_addr, 2048, err) self.assertSuccess(err) self.assertEqual(empty_str, "") one_letter_string = process.ReadCStringFromMemory( one_letter_str_addr, 2048, err ) self.assertSuccess(err) self.assertEqual(one_letter_string, "1") invalid_memory_string = process.ReadCStringFromMemory( invalid_memory_str_addr, 2048, err ) self.assertTrue(err.Fail()) self.assertTrue(invalid_memory_string == "" or invalid_memory_string is None)