libcamera/test/py/meson.build
Laurent Pinchart f326eb4bf2 test: py: LD_PRELOAD the C++ standard library when using ASan
When the ASan runtime is linked using --as-needed, its dependency on the
C++ standard library is stripped. This results to a failure to properly
handled exceptions when a C++ dynamically loaded .so is used, as in the
Python unit tests that load the libcamera Python module:

AddressSanitizer: CHECK failed: asan_interceptors.cpp:335 "((__interception::real___cxa_throw)) != (0)" (0x0, 0x0) (tid=32679)
    #0 0x7fa2f32e6c19 in CheckUnwind /var/tmp/portage/sys-devel/gcc-13.3.1_p20241025/work/gcc-13-20241025/libsanitizer/asan/asan_rtl.cpp:69
    #1 0x7fa2f330c9fd in __sanitizer::CheckFailed(char const*, int, char const*, unsigned long long, unsigned long long) /var/tmp/portage/sys-devel/gcc-13.3.1_p20241025/work/gcc-13-20241025/libsanitizer/sanitizer_common/sanitizer_termination.cpp:86
    #2 0x7fa2f3247824 in __interceptor___cxa_throw /var/tmp/portage/sys-devel/gcc-13.3.1_p20241025/work/gcc-13-20241025/libsanitizer/asan/asan_interceptors.cpp:335
    #3 0x7fa2f3247824 in __interceptor___cxa_throw /var/tmp/portage/sys-devel/gcc-13.3.1_p20241025/work/gcc-13-20241025/libsanitizer/asan/asan_interceptors.cpp:334
    #4 0x7fa2efb6da8b in operator() ../../src/py/libcamera/py_main.cpp:157
[...]

The issue has been reported in [1] and so far remains unfixed. Work
around it by preloading the C++ standard library.

[1] https://github.com/google/sanitizers/issues/934

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
2024-11-05 15:29:04 +02:00

42 lines
1.1 KiB
Meson

# SPDX-License-Identifier: CC0-1.0
if not pycamera_enabled
subdir_done()
endif
# If ASan is enabled, the link order runtime check will fail as Python is not
# linked to ASan. LD_PRELOAD the ASan runtime if available, or skip the test
# otherwise.
if asan_runtime_missing
warning('Unable to get path to ASan runtime, Python test disabled')
subdir_done()
endif
py_env = environment()
pymod = import('python')
py3 = pymod.find_installation('python3')
pypathdir = meson.project_build_root() / 'src' / 'py'
py_env.append('PYTHONPATH', pypathdir)
if asan_enabled
py_env.append('LD_PRELOAD', asan_runtime)
# Preload the C++ standard library to work around a bug in ASan when
# dynamically loading C++ .so modules.
stdlib = run_command(cxx, '-print-file-name=' + cxx_stdlib + '.so',
check : true).stdout().strip()
py_env.append('LD_PRELOAD', stdlib)
# Disable leak detection as the Python interpreter is full of leaks.
py_env.append('ASAN_OPTIONS', 'detect_leaks=0')
endif
test('pyunittests',
py3,
args : files('unittests.py'),
env : py_env,
suite : 'pybindings',
is_parallel : false)