Ed Maste c08a563292 Skip asan test on FreeBSD
The build fails due to missing asan runtime in the FreeBSD base system.
Instead of marking it expected fail, just skip until we have the runtime
available.

llvm.org/pr21136

llvm-svn: 219701
2014-10-14 18:04:47 +00:00

94 lines
3.5 KiB
Python

"""
Test the AddressSanitizer runtime support for report breakpoint and data extraction.
"""
import os, time
import unittest2
import lldb
from lldbtest import *
import lldbutil
import json
class AsanTestReportDataCase(TestBase):
mydir = TestBase.compute_mydir(__file__)
# The default compiler ("clang") may not support Address Sanitizer or it
# may not have the debugging API which was recently added, so we're calling
# self.useBuiltClang() to use clang from the llvm-build directory instead
@unittest2.skipUnless(sys.platform.startswith("darwin"), "requires Darwin")
@skipIfRemote
@dsym_test
def test_with_dsym (self):
compiler = self.findBuiltClang ()
self.buildDsym (None, compiler)
self.asan_tests ()
@skipIfFreeBSD # llvm.org/pr21136 runtimes not yet available by default
@skipIfRemote
@dwarf_test
def test_with_dwarf (self):
compiler = self.findBuiltClang ()
self.buildDwarf (None, compiler)
self.asan_tests ()
def setUp(self):
# Call super's setUp().
TestBase.setUp(self)
self.line_malloc = line_number('main.c', '// malloc line')
self.line_malloc2 = line_number('main.c', '// malloc2 line')
self.line_free = line_number('main.c', '// free line')
self.line_breakpoint = line_number('main.c', '// break line')
self.line_crash = line_number('main.c', '// BOOM line')
def asan_tests (self):
exe = os.path.join (os.getcwd(), "a.out")
self.expect("file " + exe, patterns = [ "Current executable set to .*a.out" ])
self.runCmd("run")
# ASan will relaunch the process to insert its library.
self.expect("thread list", "Process should be stopped due to exec.",
substrs = ['stopped', 'stop reason = exec'])
# no extended info when we have no ASan report
thread = self.dbg.GetSelectedTarget().process.GetSelectedThread()
s = lldb.SBStream()
self.assertFalse(thread.GetStopReasonExtendedInfoAsJSON(s))
self.runCmd("continue")
self.expect("thread list", "Process should be stopped due to ASan report",
substrs = ['stopped', 'stop reason = Use of deallocated memory detected'])
self.assertEqual(self.dbg.GetSelectedTarget().process.GetSelectedThread().GetStopReason(), lldb.eStopReasonInstrumentation)
self.expect("bt", "The backtrace should show the crashing line",
substrs = ['main.c:%d' % self.line_crash])
self.expect("thread info -s", "The extended stop info should contain the ASan provided fields",
substrs = ["access_size", "access_type", "address", "pc", "description", "heap-use-after-free"])
output_lines = self.res.GetOutput().split('\n')
json_line = output_lines[2]
data = json.loads(json_line)
self.assertEqual(data["description"], "heap-use-after-free")
self.assertEqual(data["instrumentation_class"], "AddressSanitizer")
self.assertEqual(data["stop_type"], "fatal_error")
# now let's try the SB API
process = self.dbg.GetSelectedTarget().process
thread = process.GetSelectedThread()
s = lldb.SBStream()
self.assertTrue(thread.GetStopReasonExtendedInfoAsJSON(s))
s = s.GetData()
data2 = json.loads(s)
self.assertEqual(data, data2)
if __name__ == '__main__':
import atexit
lldb.SBDebugger.Initialize()
atexit.register(lambda: lldb.SBDebugger.Terminate())
unittest2.main()