summaryrefslogtreecommitdiffstats
path: root/Lib/test/test_capi/test_object.py
diff options
context:
space:
mode:
Diffstat (limited to 'Lib/test/test_capi/test_object.py')
-rw-r--r--Lib/test/test_capi/test_object.py40
1 files changed, 40 insertions, 0 deletions
diff --git a/Lib/test/test_capi/test_object.py b/Lib/test/test_capi/test_object.py
index b0d3993..5d0a383 100644
--- a/Lib/test/test_capi/test_object.py
+++ b/Lib/test/test_capi/test_object.py
@@ -1,9 +1,12 @@
import enum
+import textwrap
import unittest
from test import support
from test.support import import_helper
from test.support import os_helper
from test.support import threading_helper
+from test.support.script_helper import assert_python_failure
+
_testlimitedcapi = import_helper.import_module('_testlimitedcapi')
_testcapi = import_helper.import_module('_testcapi')
@@ -170,5 +173,42 @@ class EnableDeferredRefcountingTest(unittest.TestCase):
self.assertTrue(_testinternalcapi.has_deferred_refcount(silly_list))
+class CAPITest(unittest.TestCase):
+ def check_negative_refcount(self, code):
+ # bpo-35059: Check that Py_DECREF() reports the correct filename
+ # when calling _Py_NegativeRefcount() to abort Python.
+ code = textwrap.dedent(code)
+ rc, out, err = assert_python_failure('-c', code)
+ self.assertRegex(err,
+ br'object\.c:[0-9]+: '
+ br'_Py_NegativeRefcount: Assertion failed: '
+ br'object has negative ref count')
+
+ @unittest.skipUnless(hasattr(_testcapi, 'negative_refcount'),
+ 'need _testcapi.negative_refcount()')
+ def test_negative_refcount(self):
+ code = """
+ import _testcapi
+ from test import support
+
+ with support.SuppressCrashReport():
+ _testcapi.negative_refcount()
+ """
+ self.check_negative_refcount(code)
+
+ @unittest.skipUnless(hasattr(_testcapi, 'decref_freed_object'),
+ 'need _testcapi.decref_freed_object()')
+ @support.skip_if_sanitizer("use after free on purpose",
+ address=True, memory=True, ub=True)
+ def test_decref_freed_object(self):
+ code = """
+ import _testcapi
+ from test import support
+
+ with support.SuppressCrashReport():
+ _testcapi.decref_freed_object()
+ """
+ self.check_negative_refcount(code)
+
if __name__ == "__main__":
unittest.main()