Author: jmolenda Date: Thu Dec 21 19:27:02 2017 New Revision: 321338 URL: http://llvm.org/viewvc/llvm-project?rev=321338&view=rev Log: Change SBProcess::ReadCStringFromMemory() back to returning an empty Python string object when it reads a 0-length string out of memory (and a successful SBError object).
<rdar://problem/26186692> Added: lldb/trunk/packages/Python/lldbsuite/test/python_api/process/read-mem-cstring/ lldb/trunk/packages/Python/lldbsuite/test/python_api/process/read-mem-cstring/Makefile lldb/trunk/packages/Python/lldbsuite/test/python_api/process/read-mem-cstring/TestReadMemCString.py lldb/trunk/packages/Python/lldbsuite/test/python_api/process/read-mem-cstring/main.c Modified: lldb/trunk/packages/Python/lldbsuite/test/functionalities/postmortem/minidump-new/TestMiniDumpNew.py lldb/trunk/scripts/Python/python-typemaps.swig Modified: lldb/trunk/packages/Python/lldbsuite/test/functionalities/postmortem/minidump-new/TestMiniDumpNew.py URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/functionalities/postmortem/minidump-new/TestMiniDumpNew.py?rev=321338&r1=321337&r2=321338&view=diff ============================================================================== --- lldb/trunk/packages/Python/lldbsuite/test/functionalities/postmortem/minidump-new/TestMiniDumpNew.py (original) +++ lldb/trunk/packages/Python/lldbsuite/test/functionalities/postmortem/minidump-new/TestMiniDumpNew.py Thu Dec 21 19:27:02 2017 @@ -117,7 +117,7 @@ class MiniDumpNewTestCase(TestBase): thread = self.process.GetThreadAtIndex(0) self.assertEqual(thread.GetStopReason(), lldb.eStopReasonNone) stop_description = thread.GetStopDescription(256) - self.assertEqual(stop_description, None) + self.assertEqual(stop_description, "") def do_test_deeper_stack(self, binary, core, pid): target = self.dbg.CreateTarget(binary) Added: lldb/trunk/packages/Python/lldbsuite/test/python_api/process/read-mem-cstring/Makefile URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/python_api/process/read-mem-cstring/Makefile?rev=321338&view=auto ============================================================================== --- lldb/trunk/packages/Python/lldbsuite/test/python_api/process/read-mem-cstring/Makefile (added) +++ lldb/trunk/packages/Python/lldbsuite/test/python_api/process/read-mem-cstring/Makefile Thu Dec 21 19:27:02 2017 @@ -0,0 +1,6 @@ +LEVEL = ../../../make + +C_SOURCES := main.c +EXE := read-mem-cstring + +include $(LEVEL)/Makefile.rules Added: lldb/trunk/packages/Python/lldbsuite/test/python_api/process/read-mem-cstring/TestReadMemCString.py URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/python_api/process/read-mem-cstring/TestReadMemCString.py?rev=321338&view=auto ============================================================================== --- lldb/trunk/packages/Python/lldbsuite/test/python_api/process/read-mem-cstring/TestReadMemCString.py (added) +++ lldb/trunk/packages/Python/lldbsuite/test/python_api/process/read-mem-cstring/TestReadMemCString.py Thu Dec 21 19:27:02 2017 @@ -0,0 +1,62 @@ +"""Test reading c-strings from memory via SB API.""" + +from __future__ import print_function + +import os +import lldb +from lldbsuite.test.decorators import * +from lldbsuite.test.lldbtest import * +from lldbsuite.test import lldbutil + + +class TestReadMemCString(TestBase): + + mydir = TestBase.compute_mydir(__file__) + + def setUp(self): + TestBase.setUp(self) + + # Need to have a char* pointer that points to unmapped memory to run + # this test on other platforms -- Darwin only for now. + @skipUnlessDarwin + 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_spec = lldb.SBFileSpec(self.main_source) + self.exe = os.path.join(os.getcwd(), "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.assertTrue(err.Success()) + self.assertTrue(empty_str_addr != lldb.LLDB_INVALID_ADDRESS) + + one_letter_str_addr = frame.FindVariable("one_letter_string").GetValueAsUnsigned(err) + self.assertTrue(err.Success()) + self.assertTrue(one_letter_str_addr != lldb.LLDB_INVALID_ADDRESS) + + invalid_memory_str_addr = frame.FindVariable("invalid_memory_string").GetValueAsUnsigned(err) + self.assertTrue(err.Success()) + self.assertTrue(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.assertTrue(err.Success()) + self.assertTrue(empty_str == "") + + one_letter_string = process.ReadCStringFromMemory(one_letter_str_addr, 2048, err) + self.assertTrue(err.Success()) + self.assertTrue(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 == None) Added: lldb/trunk/packages/Python/lldbsuite/test/python_api/process/read-mem-cstring/main.c URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/python_api/process/read-mem-cstring/main.c?rev=321338&view=auto ============================================================================== --- lldb/trunk/packages/Python/lldbsuite/test/python_api/process/read-mem-cstring/main.c (added) +++ lldb/trunk/packages/Python/lldbsuite/test/python_api/process/read-mem-cstring/main.c Thu Dec 21 19:27:02 2017 @@ -0,0 +1,13 @@ +#include <stdlib.h> +int main () +{ + const char *empty_string = ""; + const char *one_letter_string = "1"; +#if defined (__APPLE__) + const char *invalid_memory_string = (char*)0x100; // lower 4k is always PAGEZERO & unreadable on darwin +#else + const char *invalid_memory_string = -1ULL; // maybe an invalid address on other platforms? +#endif + + return empty_string[0] + one_letter_string[0]; // breakpoint here +} Modified: lldb/trunk/scripts/Python/python-typemaps.swig URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/scripts/Python/python-typemaps.swig?rev=321338&r1=321337&r2=321338&view=diff ============================================================================== --- lldb/trunk/scripts/Python/python-typemaps.swig (original) +++ lldb/trunk/scripts/Python/python-typemaps.swig Thu Dec 21 19:27:02 2017 @@ -102,7 +102,8 @@ %typemap(argout) (char *dst, size_t dst_len) { Py_XDECREF($result); /* Blow away any previous result */ if (result == 0) { - $result = Py_None; + lldb_private::PythonString string(""); + $result = string.release(); Py_INCREF($result); } else { llvm::StringRef ref(static_cast<const char*>($1), result); _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits