[Lldb-commits] [lldb] r321338 - Change SBProcess::ReadCStringFromMemory() back to returning

Jason Molenda via lldb-commits lldb-commits at lists.llvm.org
Thu Dec 21 19:27:02 PST 2017


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);




More information about the lldb-commits mailing list