diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2017-12-24 01:01:00 +0000 | 
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2017-12-24 01:01:00 +0000 | 
| commit | 23629167fefb8117a4d2cc9213c8a29d5b4a1197 (patch) | |
| tree | c410512ef1b5e0f0e81b7f333cafabc3ad716f5d /packages/Python/lldbsuite/test/python_api | |
| parent | ef5d0b5e97ec8e6fa395d377b09aa7755e345b4f (diff) | |
Notes
Diffstat (limited to 'packages/Python/lldbsuite/test/python_api')
3 files changed, 74 insertions, 0 deletions
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 0000000000000..f3414925f32bc --- /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 0000000000000..6302711606c51 --- /dev/null +++ b/packages/Python/lldbsuite/test/python_api/process/read-mem-cstring/TestReadMemCString.py @@ -0,0 +1,57 @@ +"""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__) +    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_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 0000000000000..03c6674171298 --- /dev/null +++ b/packages/Python/lldbsuite/test/python_api/process/read-mem-cstring/main.c @@ -0,0 +1,11 @@ +#include <stdlib.h> +int main () +{ +   const char *empty_string = ""; +   const char *one_letter_string = "1"; +   // This expects that lower 4k of memory will be mapped unreadable, which most +   // OSs do (to catch null pointer dereferences). +   const char *invalid_memory_string = (char*)0x100; + +   return empty_string[0] + one_letter_string[0]; // breakpoint here +}  | 
