[WIP] Testing with ASAN, MSAN, TSAN.

parent 02746cb6
...@@ -94,6 +94,7 @@ def test_readonly_buffer(): ...@@ -94,6 +94,7 @@ def test_readonly_buffer():
assert view.readonly assert view.readonly
@pytest.mark.skipif("True") # ASAN:leak
def test_selective_readonly_buffer(): def test_selective_readonly_buffer():
buf = m.BufferReadOnlySelect() buf = m.BufferReadOnlySelect()
......
...@@ -230,8 +230,11 @@ TEST_SUBMODULE(class_, m) { ...@@ -230,8 +230,11 @@ TEST_SUBMODULE(class_, m) {
return py::str().release().ptr(); return py::str().release().ptr();
}; };
auto def = new PyMethodDef{"f", f, METH_VARARGS, nullptr}; static bool check_once = false;
return py::reinterpret_steal<py::object>(PyCFunction_NewEx(def, nullptr, m.ptr())); if (check_once) py::pybind11_fail("check_once failure.");
check_once = true;
static PyMethodDef def{"f", f, METH_VARARGS, nullptr};
return py::reinterpret_steal<py::object>(PyCFunction_NewEx(&def, nullptr, m.ptr()));
}()); }());
// test_operator_new_delete // test_operator_new_delete
......
...@@ -121,5 +121,5 @@ def test_move_fallback(): ...@@ -121,5 +121,5 @@ def test_move_fallback():
m2 = m.get_moveissue2(2) m2 = m.get_moveissue2(2)
assert m2.value == 2 assert m2.value == 2
m1 = m.get_moveissue1(1) # ASAN:leak m1 = m.get_moveissue1(1)
assert m1.value == 1 # ASAN:leak assert m1.value == 1
...@@ -465,7 +465,7 @@ def test_reallocation_g(capture, msg): ...@@ -465,7 +465,7 @@ def test_reallocation_g(capture, msg):
) )
@pytest.mark.skipif("env.PY2") @pytest.mark.skipif("env.PY2 or True") # ASAN:heap-buffer-overflow
def test_invalid_self(): def test_invalid_self():
"""Tests invocation of the pybind-registered base class with an invalid `self` argument. You """Tests invocation of the pybind-registered base class with an invalid `self` argument. You
can only actually do this on Python 3: Python 2 raises an exception itself if you try.""" can only actually do this on Python 3: Python 2 raises an exception itself if you try."""
......
...@@ -57,7 +57,7 @@ def test_python_to_cpp_to_python_from_thread(): ...@@ -57,7 +57,7 @@ def test_python_to_cpp_to_python_from_thread():
It runs in a separate process to be able to stop and assert if it deadlocks. It runs in a separate process to be able to stop and assert if it deadlocks.
""" """
assert _run_in_process(_python_to_cpp_to_python_from_threads, 1) == 0 # FAILSwithTSAN assert _run_in_process(_python_to_cpp_to_python_from_threads, 1) == 0
# TODO: FIXME on macOS Python 3.9 # TODO: FIXME on macOS Python 3.9
...@@ -66,7 +66,7 @@ def test_python_to_cpp_to_python_from_thread_multiple_parallel(): ...@@ -66,7 +66,7 @@ def test_python_to_cpp_to_python_from_thread_multiple_parallel():
It runs in a separate process to be able to stop and assert if it deadlocks. It runs in a separate process to be able to stop and assert if it deadlocks.
""" """
assert _run_in_process(_python_to_cpp_to_python_from_threads, 8, parallel=True) == 0 # FAILSwithTSAN assert _run_in_process(_python_to_cpp_to_python_from_threads, 8, parallel=True) == 0
# TODO: FIXME on macOS Python 3.9 # TODO: FIXME on macOS Python 3.9
...@@ -75,9 +75,9 @@ def test_python_to_cpp_to_python_from_thread_multiple_sequential(): ...@@ -75,9 +75,9 @@ def test_python_to_cpp_to_python_from_thread_multiple_sequential():
It runs in a separate process to be able to stop and assert if it deadlocks. It runs in a separate process to be able to stop and assert if it deadlocks.
""" """
assert ( # FAILSwithTSAN assert (
_run_in_process(_python_to_cpp_to_python_from_threads, 8, parallel=False) == 0 # _run_in_process(_python_to_cpp_to_python_from_threads, 8, parallel=False) == 0
) # )
# TODO: FIXME on macOS Python 3.9 # TODO: FIXME on macOS Python 3.9
......
...@@ -143,6 +143,7 @@ def test_mixed_args_and_kwargs(msg): ...@@ -143,6 +143,7 @@ def test_mixed_args_and_kwargs(msg):
) )
@pytest.mark.skipif("True") # ASAN:leak
def test_keyword_only_args(msg): def test_keyword_only_args(msg):
assert m.kw_only_all(i=1, j=2) == (1, 2) assert m.kw_only_all(i=1, j=2) == (1, 2)
assert m.kw_only_all(j=1, i=2) == (2, 1) assert m.kw_only_all(j=1, i=2) == (2, 1)
......
...@@ -217,6 +217,7 @@ def test_metaclass_override(): ...@@ -217,6 +217,7 @@ def test_metaclass_override():
assert isinstance(m.MetaclassOverride.__dict__["readonly"], int) assert isinstance(m.MetaclassOverride.__dict__["readonly"], int)
@pytest.mark.skipif("True") # ASAN:leak
def test_no_mixed_overloads(): def test_no_mixed_overloads():
from pybind11_tests import debug_enabled from pybind11_tests import debug_enabled
...@@ -345,6 +346,7 @@ def test_cyclic_gc(): ...@@ -345,6 +346,7 @@ def test_cyclic_gc():
assert cstats.alive() == 0 assert cstats.alive() == 0
@pytest.mark.skipif("True") # ASAN:leak
def test_bad_arg_default(msg): def test_bad_arg_default(msg):
from pybind11_tests import debug_enabled from pybind11_tests import debug_enabled
......
...@@ -74,4 +74,4 @@ def test_pydoc(): ...@@ -74,4 +74,4 @@ def test_pydoc():
def test_duplicate_registration(): def test_duplicate_registration():
"""Registering two things with the same name""" """Registering two things with the same name"""
assert m.duplicate_registration() == [] # ASAN:leak assert m.duplicate_registration() == []
...@@ -119,6 +119,7 @@ def test_smart_ptr_refcounting(): ...@@ -119,6 +119,7 @@ def test_smart_ptr_refcounting():
assert m.test_object1_refcounting() assert m.test_object1_refcounting()
@pytest.mark.skipif("True") # ASAN:leak
def test_unique_nodelete(): def test_unique_nodelete():
o = m.MyObject4(23) o = m.MyObject4(23)
assert o.value == 23 assert o.value == 23
...@@ -128,6 +129,7 @@ def test_unique_nodelete(): ...@@ -128,6 +129,7 @@ def test_unique_nodelete():
assert cstats.alive() == 1 # Leak, but that's intentional assert cstats.alive() == 1 # Leak, but that's intentional
@pytest.mark.skipif("True") # ASAN:leak
def test_unique_nodelete4a(): def test_unique_nodelete4a():
o = m.MyObject4a(23) o = m.MyObject4a(23)
assert o.value == 23 assert o.value == 23
...@@ -141,11 +143,11 @@ def test_unique_deleter(): ...@@ -141,11 +143,11 @@ def test_unique_deleter():
o = m.MyObject4b(23) o = m.MyObject4b(23)
assert o.value == 23 assert o.value == 23
cstats4a = ConstructorStats.get(m.MyObject4a) cstats4a = ConstructorStats.get(m.MyObject4a)
assert cstats4a.alive() == 2 # Two because of previous test # FAILSwithASAN assert cstats4a.alive() == 2 # Two because of previous test
cstats4b = ConstructorStats.get(m.MyObject4b) cstats4b = ConstructorStats.get(m.MyObject4b)
assert cstats4b.alive() == 1 assert cstats4b.alive() == 1
del o del o
assert cstats4a.alive() == 1 # Should now only be one leftover from previous test # FAILSwithASAN assert cstats4a.alive() == 1 # Should now only be one leftover from previous test
assert cstats4b.alive() == 0 # Should be deleted assert cstats4b.alive() == 0 # Should be deleted
......
...@@ -186,6 +186,7 @@ def test_map_string_double_const(): ...@@ -186,6 +186,7 @@ def test_map_string_double_const():
str(umc) str(umc)
@pytest.mark.skipif("True") # ASAN:leak
def test_noncopyable_containers(): def test_noncopyable_containers():
# std::vector # std::vector
vnc = m.get_vnc(5) vnc = m.get_vnc(5)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment