]> granicus.if.org Git - php/commitdiff
Run arginfo/ZPP verification tests in strict mode as well
authorMáté Kocsis <kocsismate@woohoolabs.com>
Thu, 22 Oct 2020 10:48:12 +0000 (12:48 +0200)
committerMáté Kocsis <kocsismate@woohoolabs.com>
Thu, 22 Oct 2020 17:01:40 +0000 (19:01 +0200)
Closes GH-6370

Zend/tests/arginfo_zpp_mismatch.inc [new file with mode: 0644]
Zend/tests/arginfo_zpp_mismatch.phpt
Zend/tests/arginfo_zpp_mismatch_strict.phpt [new file with mode: 0644]

diff --git a/Zend/tests/arginfo_zpp_mismatch.inc b/Zend/tests/arginfo_zpp_mismatch.inc
new file mode 100644 (file)
index 0000000..2207d76
--- /dev/null
@@ -0,0 +1,39 @@
+<?php
+
+function skipFunction($function): bool {
+    if (false
+        /* expect input / hang */
+     || $function === 'readline'
+     || $function === 'readline_read_history'
+     || $function === 'readline_write_history'
+        /* intentionally violate invariants */
+     || $function === 'zend_create_unterminated_string'
+     || $function === 'zend_test_array_return'
+     || $function === 'zend_leak_bytes'
+        /* mess with output */
+     || (is_string($function) && str_starts_with($function, 'ob_'))
+     || $function === 'output_add_rewrite_var'
+     || $function === 'error_log'
+        /* may spend a lot of time waiting for connection timeouts */
+     || (is_string($function) && str_contains($function, 'connect'))
+     || (is_string($function) && str_starts_with($function, 'snmp'))
+     || (is_array($function) && get_class($function[0]) === mysqli::class
+         && in_array($function[1], ['__construct', 'connect', 'real_connect']))
+        /* misc */
+     || $function === 'mail'
+     || $function === 'mb_send_mail'
+     || $function === 'pcntl_fork'
+     || $function === 'posix_kill'
+     || $function === 'posix_setrlimit'
+     || $function === 'sapi_windows_generate_ctrl_event'
+     || $function === 'imagegrabscreen'
+    ) {
+        return true;
+    }
+    if ($function[0] instanceof SoapServer) {
+        /* TODO: Uses fatal errors */
+        return true;
+    }
+
+    return false;
+}
index 2a9522a6de8dccd9fd6d789303d3c29ada04f4f4..f5df299430090fbff819761cae2af22f3b49cbe4 100644 (file)
@@ -7,38 +7,10 @@ if (getenv('SKIP_MSAN')) die("skip msan misses interceptors for some functions")
 --FILE--
 <?php
 
+require __DIR__ . "/arginfo_zpp_mismatch.inc";
+
 function test($function) {
-    if (false
-        /* expect input / hang */
-     || $function === 'readline'
-     || $function === 'readline_read_history'
-     || $function === 'readline_write_history'
-        /* intentionally violate invariants */
-     || $function === 'zend_create_unterminated_string'
-     || $function === 'zend_test_array_return'
-     || $function === 'zend_leak_bytes'
-        /* mess with output */
-     || (is_string($function) && str_starts_with($function, 'ob_'))
-     || $function === 'output_add_rewrite_var'
-     || $function === 'error_log'
-        /* may spend a lot of time waiting for connection timeouts */
-     || (is_string($function) && str_contains($function, 'connect'))
-     || (is_string($function) && str_starts_with($function, 'snmp'))
-     || (is_array($function) && get_class($function[0]) === mysqli::class
-         && in_array($function[1], ['__construct', 'connect', 'real_connect']))
-        /* misc */
-     || $function === 'mail'
-     || $function === 'mb_send_mail'
-     || $function === 'pcntl_fork'
-     || $function === 'posix_kill'
-     || $function === 'posix_setrlimit'
-     || $function === 'sapi_windows_generate_ctrl_event'
-     || $function === 'imagegrabscreen'
-    ) {
-        return;
-    }
-    if ($function[0] instanceof SoapServer) {
-        /* TODO: Uses fatal errors */
+    if (skipFunction($function)) {
         return;
     }
 
diff --git a/Zend/tests/arginfo_zpp_mismatch_strict.phpt b/Zend/tests/arginfo_zpp_mismatch_strict.phpt
new file mode 100644 (file)
index 0000000..8e77af9
--- /dev/null
@@ -0,0 +1,85 @@
+--TEST--
+Test that there is no arginfo/zpp mismatch in strict mode
+--SKIPIF--
+<?php
+if (getenv('SKIP_MSAN')) die("skip msan misses interceptors for some functions");
+?>
+--FILE--
+<?php
+
+declare(strict_types=1);
+
+require __DIR__ . "/arginfo_zpp_mismatch.inc";
+
+function test($function) {
+    if (skipFunction($function)) {
+        return;
+    }
+
+    ob_start();
+    if (is_string($function)) {
+        echo "Testing $function\n";
+    } else {
+        echo "Testing " . get_class($function[0]) . "::$function[1]\n";
+    }
+    try {
+        @$function();
+    } catch (Throwable) {
+    }
+    try {
+        @$function(null);
+    } catch (Throwable) {
+    }
+    try {
+        @$function(null, null);
+    } catch (Throwable) {
+    }
+    try {
+        @$function(null, null, null);
+    } catch (Throwable) {
+    }
+    try {
+        @$function(null, null, null, null);
+    } catch (Throwable) {
+    }
+    try {
+        @$function(null, null, null, null, null);
+    } catch (Throwable) {
+    }
+    try {
+        @$function(null, null, null, null, null, null);
+    } catch (Throwable) {
+    }
+    try {
+        @$function(null, null, null, null, null, null, null);
+    } catch (Throwable) {
+    }
+    try {
+        @$function(null, null, null, null, null, null, null, null);
+    } catch (Throwable) {
+    }
+    ob_end_clean();
+}
+
+foreach (get_defined_functions()["internal"] as $function) {
+    test($function);
+}
+
+foreach (get_declared_classes() as $class) {
+    try {
+        $rc = new ReflectionClass($class);
+        $obj = $rc->newInstanceWithoutConstructor();
+    } catch (Throwable) {
+        continue;
+    }
+
+    foreach (get_class_methods($class) as $method) {
+        test([$obj, $method]);
+    }
+}
+
+// var_dump() and debug_zval_dump() print all arguments
+?>
+===DONE===
+--EXPECT--
+===DONE===