summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Molenda <jmolenda@apple.com>2017-12-22 03:27:02 +0000
committerJason Molenda <jmolenda@apple.com>2017-12-22 03:27:02 +0000
commit31f6bd97ca8ec945d75612a984d4dddc35058641 (patch)
tree954941f601f593619b88ffa0e297fe8509c13aa3
parentb21b14deb9ddd91b49efba0c3ee92ab9ed74a327 (diff)
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> git-svn-id: https://llvm.org/svn/llvm-project/lldb/trunk@321338 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--packages/Python/lldbsuite/test/functionalities/postmortem/minidump-new/TestMiniDumpNew.py2
-rw-r--r--packages/Python/lldbsuite/test/python_api/process/read-mem-cstring/Makefile6
-rw-r--r--packages/Python/lldbsuite/test/python_api/process/read-mem-cstring/TestReadMemCString.py62
-rw-r--r--packages/Python/lldbsuite/test/python_api/process/read-mem-cstring/main.c13
-rw-r--r--scripts/Python/python-typemaps.swig3
5 files changed, 84 insertions, 2 deletions
diff --git a/packages/Python/lldbsuite/test/functionalities/postmortem/minidump-new/TestMiniDumpNew.py b/packages/Python/lldbsuite/test/functionalities/postmortem/minidump-new/TestMiniDumpNew.py
index 178bb678d..4e587b92c 100644
--- a/packages/Python/lldbsuite/test/functionalities/postmortem/minidump-new/TestMiniDumpNew.py
+++ b/packages/Python/lldbsuite/test/functionalities/postmortem/minidump-new/TestMiniDumpNew.py
@@ -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)
diff --git a/packages/Python/lldbsuite/test/python_api/process/read-mem-cstring/Makefile b/packages/Python/lldbsuite/test/python_api/process/read-mem-cstring/Makefile
new file mode 100644
index 000000000..f3414925f
--- /dev/null
+++ b/packages/Python/lldbsuite/test/python_api/process/read-mem-cstring/Makefile
@@ -0,0 +1,6 @@
+LEVEL = ../../../make
+
+C_SOURCES := main.c
+EXE := read-mem-cstring
+
+include $(LEVEL)/Makefile.rules
diff --git a/packages/Python/lldbsuite/test/python_api/process/read-mem-cstring/TestReadMemCString.py b/packages/Python/lldbsuite/test/python_api/process/read-mem-cstring/TestReadMemCString.py
new file mode 100644
index 000000000..e99779a57
--- /dev/null
+++ b/packages/Python/lldbsuite/test/python_api/process/read-mem-cstring/TestReadMemCString.py
@@ -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)
diff --git a/packages/Python/lldbsuite/test/python_api/process/read-mem-cstring/main.c b/packages/Python/lldbsuite/test/python_api/process/read-mem-cstring/main.c
new file mode 100644
index 000000000..94916997a
--- /dev/null
+++ b/packages/Python/lldbsuite/test/python_api/process/read-mem-cstring/main.c
@@ -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
+}
diff --git a/scripts/Python/python-typemaps.swig b/scripts/Python/python-typemaps.swig
index df16a6d27..29e5d9b15 100644
--- a/scripts/Python/python-typemaps.swig
+++ b/scripts/Python/python-typemaps.swig
@@ -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);