teak-llvm/lldb/packages/Python/lldbsuite/test/lang/cpp/bitfields/TestCppBitfields.py
Pavel Labath 77cedb0cdb [lldb] Fix nondeterminism in TestCppBitfields
The test was printing a char[3] variable without a terminating nul. The
memory after that variable (an unnamed bitfield) was not initialized. If
the memory happened to be nonzero, the summary provider for the variable
would run off into the next field.

This is probably not the right behavior (it should stop at the end of
the array), but this is not the purpose of this test. I have filed
pr44649 for this bug, and fixed the test to not depend on this behavior.
2020-01-24 12:09:20 +01:00

106 lines
3.6 KiB
Python

"""Show bitfields and check that they display correctly."""
import lldb
from lldbsuite.test.decorators import *
from lldbsuite.test.lldbtest import *
from lldbsuite.test import lldbutil
class CppBitfieldsTestCase(TestBase):
mydir = TestBase.compute_mydir(__file__)
def setUp(self):
# Call super's setUp().
TestBase.setUp(self)
# Find the line number to break inside main().
self.line = line_number('main.cpp', '// Set break point at this line.')
# BitFields exhibit crashes in record layout on Windows
# (http://llvm.org/pr21800)
@skipIfWindows
def test_and_run_command(self):
"""Test 'frame variable ...' on a variable with bitfields."""
self.build()
lldbutil.run_to_source_breakpoint(self, '// Set break point at this line.',
lldb.SBFileSpec("main.cpp", False))
# The stop reason of the thread should be breakpoint.
self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT,
substrs=['stopped',
'stop reason = breakpoint'])
# The breakpoint should have a hit count of 1.
self.expect("breakpoint list -f", BREAKPOINT_HIT_ONCE,
substrs=[' resolved, hit count = 1'])
self.expect("expr (lba.a)", VARIABLES_DISPLAYED_CORRECTLY,
substrs=['unsigned int', '2'])
self.expect("expr (lbb.b)", VARIABLES_DISPLAYED_CORRECTLY,
substrs=['unsigned int', '3'])
self.expect("expr (lbc.c)", VARIABLES_DISPLAYED_CORRECTLY,
substrs=['unsigned int', '4'])
self.expect("expr (lbd.a)", VARIABLES_DISPLAYED_CORRECTLY,
substrs=['unsigned int', '5'])
self.expect("expr (clang_example.f.a)", VARIABLES_DISPLAYED_CORRECTLY,
substrs=['uint64_t', '1'])
self.expect(
"frame variable --show-types lba",
VARIABLES_DISPLAYED_CORRECTLY,
substrs=[
'(int:32) = ',
'(unsigned int:20) a = 2',
])
self.expect(
"frame variable --show-types lbb",
VARIABLES_DISPLAYED_CORRECTLY,
substrs=[
'(unsigned int:1) a = 1',
'(int:31) =',
'(unsigned int:20) b = 3',
])
self.expect(
"frame variable --show-types lbc",
VARIABLES_DISPLAYED_CORRECTLY,
substrs=[
'(int:22) =',
'(unsigned int:1) a = 1',
'(unsigned int:1) b = 0',
'(unsigned int:5) c = 4',
'(unsigned int:1) d = 1',
'(int:2) =',
'(unsigned int:20) e = 20',
])
self.expect(
"frame variable --show-types lbd",
VARIABLES_DISPLAYED_CORRECTLY,
substrs=[
'(char [3]) arr = "ab"',
'(int:32) =',
'(unsigned int:20) a = 5',
])
self.expect(
"frame variable --show-types clang_example",
VARIABLES_DISPLAYED_CORRECTLY,
substrs=[
'(int:22) =',
'(uint64_t:1) a = 1',
'(uint64_t:1) b = 0',
'(uint64_t:1) c = 1',
'(uint64_t:1) d = 0',
'(uint64_t:1) e = 1',
'(uint64_t:1) f = 0',
'(uint64_t:1) g = 1',
'(uint64_t:1) h = 0',
'(uint64_t:1) i = 1',
'(uint64_t:1) j = 0',
'(uint64_t:1) k = 1',
])