[libcamera-devel,v1,3/4] test: py: Fix test failure when ASan is enabled
diff mbox series

Message ID 20221222010132.22177-4-laurent.pinchart@ideasonboard.com
State Accepted
Headers show
Series
  • test: Various unit test cleanups
Related show

Commit Message

Laurent Pinchart Dec. 22, 2022, 1:01 a.m. UTC
When the address sanitizer is enabled, the Python unit tests fail due to
the link order runtime check as the Python interpreter is (generally)
not linked to ASan. Fix this by LD_PRELOAD'ing the ASan runtime. We have
to disable the leak detector as the Python interpreter itself leaks
memory, which would result in test failures.

To LD_PRELOAD the ASan runtime, the path to the binary needs to be
known. gcc gives us a generic way to get the path, but that doesn't work
with clang as the ASan runtime file name depends on the clang version
and target architecture. We thus have to keep the Python test disabled
with ASan is enabled and libcamera is compiled with clang.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
 test/py/meson.build | 17 ++++++++++++++++-
 1 file changed, 16 insertions(+), 1 deletion(-)

Comments

Umang Jain Dec. 23, 2022, 4:58 p.m. UTC | #1
HI Laurent,

Thank you for the patch

On 12/22/22 6:31 AM, Laurent Pinchart via libcamera-devel wrote:
> When the address sanitizer is enabled, the Python unit tests fail due to
> the link order runtime check as the Python interpreter is (generally)
> not linked to ASan. Fix this by LD_PRELOAD'ing the ASan runtime. We have
> to disable the leak detector as the Python interpreter itself leaks
> memory, which would result in test failures.
>
> To LD_PRELOAD the ASan runtime, the path to the binary needs to be
> known. gcc gives us a generic way to get the path, but that doesn't work
> with clang as the ASan runtime file name depends on the clang version
> and target architecture. We thus have to keep the Python test disabled
> with ASan is enabled and libcamera is compiled with clang.
>
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>

Acked-by: Umang Jain <umang.jain@ideasonboard.com>
> ---
>   test/py/meson.build | 17 ++++++++++++++++-
>   1 file changed, 16 insertions(+), 1 deletion(-)
>
> diff --git a/test/py/meson.build b/test/py/meson.build
> index 2affdbd491a3..639f173594a8 100644
> --- a/test/py/meson.build
> +++ b/test/py/meson.build
> @@ -4,14 +4,29 @@ 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
> +
>   pymod = import('python')
>   py3 = pymod.find_installation('python3')
>   
>   pypathdir = meson.project_build_root() / 'src' / 'py'
> +py_env = ['PYTHONPATH=' + pypathdir]
> +
> +if asan_enabled
> +    # Disable leak detection as the Python interpreter is full of leaks.
> +    py_env += ['LD_PRELOAD=' + asan_runtime, 'ASAN_OPTIONS=detect_leaks=0']
> +endif
>   
>   test('pyunittests',
>        py3,
>        args : files('unittests.py'),
> -     env : ['PYTHONPATH=' + pypathdir],
> +     env : py_env,
>        suite : 'pybindings',
>        is_parallel : false)
Paul Elder Dec. 24, 2022, 12:26 a.m. UTC | #2
On Thu, Dec 22, 2022 at 03:01:31AM +0200, Laurent Pinchart via libcamera-devel wrote:
> When the address sanitizer is enabled, the Python unit tests fail due to
> the link order runtime check as the Python interpreter is (generally)
> not linked to ASan. Fix this by LD_PRELOAD'ing the ASan runtime. We have
> to disable the leak detector as the Python interpreter itself leaks
> memory, which would result in test failures.
> 
> To LD_PRELOAD the ASan runtime, the path to the binary needs to be
> known. gcc gives us a generic way to get the path, but that doesn't work
> with clang as the ASan runtime file name depends on the clang version
> and target architecture. We thus have to keep the Python test disabled
> with ASan is enabled and libcamera is compiled with clang.

s/with/when/

> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> ---
>  test/py/meson.build | 17 ++++++++++++++++-
>  1 file changed, 16 insertions(+), 1 deletion(-)
> 
> diff --git a/test/py/meson.build b/test/py/meson.build
> index 2affdbd491a3..639f173594a8 100644
> --- a/test/py/meson.build
> +++ b/test/py/meson.build
> @@ -4,14 +4,29 @@ 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

s/ASAn/ASan/


Reviewed-by: Paul Elder <paul.elder@ideasonboard.com>

> +# otherwise.
> +
> +if asan_runtime_missing
> +    warning('Unable to get path to ASan runtime, Python test disabled')
> +    subdir_done()
> +endif
> +
>  pymod = import('python')
>  py3 = pymod.find_installation('python3')
>  
>  pypathdir = meson.project_build_root() / 'src' / 'py'
> +py_env = ['PYTHONPATH=' + pypathdir]
> +
> +if asan_enabled
> +    # Disable leak detection as the Python interpreter is full of leaks.
> +    py_env += ['LD_PRELOAD=' + asan_runtime, 'ASAN_OPTIONS=detect_leaks=0']
> +endif
>  
>  test('pyunittests',
>       py3,
>       args : files('unittests.py'),
> -     env : ['PYTHONPATH=' + pypathdir],
> +     env : py_env,
>       suite : 'pybindings',
>       is_parallel : false)

Patch
diff mbox series

diff --git a/test/py/meson.build b/test/py/meson.build
index 2affdbd491a3..639f173594a8 100644
--- a/test/py/meson.build
+++ b/test/py/meson.build
@@ -4,14 +4,29 @@  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
+
 pymod = import('python')
 py3 = pymod.find_installation('python3')
 
 pypathdir = meson.project_build_root() / 'src' / 'py'
+py_env = ['PYTHONPATH=' + pypathdir]
+
+if asan_enabled
+    # Disable leak detection as the Python interpreter is full of leaks.
+    py_env += ['LD_PRELOAD=' + asan_runtime, 'ASAN_OPTIONS=detect_leaks=0']
+endif
 
 test('pyunittests',
      py3,
      args : files('unittests.py'),
-     env : ['PYTHONPATH=' + pypathdir],
+     env : py_env,
      suite : 'pybindings',
      is_parallel : false)