]> granicus.if.org Git - python/commitdiff
Issue 23314: SuppressCrashReports now disables CRT assertions
authorSteve Dower <steve.dower@microsoft.com>
Mon, 23 Feb 2015 15:56:13 +0000 (07:56 -0800)
committerSteve Dower <steve.dower@microsoft.com>
Mon, 23 Feb 2015 15:56:13 +0000 (07:56 -0800)
SuppressCrashReports should be used in test subprocesses that test invalid conditions.

Lib/test/support/__init__.py
Lib/test/tf_inherit_check.py

index 205c47c0c1bbbb9fc444d3a9e3a9a83ea4033cad..7bfa12c2d053ac2d23fe6e6f27f435984acc7c36 100644 (file)
@@ -2151,6 +2151,7 @@ class SuppressCrashReport:
     disable the creation of coredump file.
     """
     old_value = None
+    old_modes = None
 
     def __enter__(self):
         """On Windows, disable Windows Error Reporting dialogs using
@@ -2168,6 +2169,26 @@ class SuppressCrashReport:
             SEM_NOGPFAULTERRORBOX = 0x02
             self.old_value = self._k32.SetErrorMode(SEM_NOGPFAULTERRORBOX)
             self._k32.SetErrorMode(self.old_value | SEM_NOGPFAULTERRORBOX)
+
+            # Suppress assert dialogs in debug builds
+            # (see http://bugs.python.org/issue23314)
+            try:
+                import msvcrt
+                msvcrt.CrtSetReportMode
+            except (AttributeError, ImportError):
+                # no msvcrt or a release build
+                pass
+            else:
+                self.old_modes = {}
+                for report_type in [msvcrt.CRT_WARN,
+                                    msvcrt.CRT_ERROR,
+                                    msvcrt.CRT_ASSERT]:
+                    old_mode = msvcrt.CrtSetReportMode(report_type,
+                            msvcrt.CRTDBG_MODE_FILE)
+                    old_file = msvcrt.CrtSetReportFile(report_type,
+                            msvcrt.CRTDBG_FILE_STDERR)
+                    self.old_modes[report_type] = old_mode, old_file
+
         else:
             if resource is not None:
                 try:
@@ -2199,6 +2220,12 @@ class SuppressCrashReport:
 
         if sys.platform.startswith('win'):
             self._k32.SetErrorMode(self.old_value)
+
+            if self.old_modes:
+                import msvcrt
+                for report_type, (old_mode, old_file) in self.old_modes.items():
+                    msvcrt.CrtSetReportMode(report_type, old_mode)
+                    msvcrt.CrtSetReportFile(report_type, old_file)
         else:
             if resource is not None:
                 try:
index afe50d232500168b476ffd9f5049dee992d80916..138f25a8580ea9a917970931d44fabde5e07b91f 100644 (file)
@@ -4,22 +4,24 @@
 
 import sys
 import os
+from test.support import SuppressCrashReport
 
-verbose = (sys.argv[1] == 'v')
-try:
-    fd = int(sys.argv[2])
-
+with SuppressCrashReport():
+    verbose = (sys.argv[1] == 'v')
     try:
-        os.write(fd, b"blat")
-    except OSError:
-        # Success -- could not write to fd.
-        sys.exit(0)
-    else:
+        fd = int(sys.argv[2])
+
+        try:
+            os.write(fd, b"blat")
+        except OSError:
+            # Success -- could not write to fd.
+            sys.exit(0)
+        else:
+            if verbose:
+                sys.stderr.write("fd %d is open in child" % fd)
+            sys.exit(1)
+
+    except Exception:
         if verbose:
-            sys.stderr.write("fd %d is open in child" % fd)
+            raise
         sys.exit(1)
-
-except Exception:
-    if verbose:
-        raise
-    sys.exit(1)