]> granicus.if.org Git - php/commitdiff
Mark assert() as INDIRECT_VAR_ACCESS
authorNikita Popov <nikic@php.net>
Tue, 17 May 2016 14:13:17 +0000 (16:13 +0200)
committerNikita Popov <nikic@php.net>
Tue, 17 May 2016 14:13:17 +0000 (16:13 +0200)
I don't like this... we may want to detect "obviously not string"
operands by checking for the result of a comparison instruction.

Zend/tests/assert/indirect_var_access_misoptimization.phpt [new file with mode: 0644]
ext/opcache/Optimizer/zend_cfg.c

diff --git a/Zend/tests/assert/indirect_var_access_misoptimization.phpt b/Zend/tests/assert/indirect_var_access_misoptimization.phpt
new file mode 100644 (file)
index 0000000..61c193a
--- /dev/null
@@ -0,0 +1,19 @@
+--TEST--
+Misoptimization when variable is modified by assert()
+--INI--
+zend.assertions=1
+--FILE--
+<?php
+
+function test() {
+    $i = 0;
+    assert('$i = new stdClass');
+    $i += 1;
+    var_dump($i);
+}
+test();
+
+?>
+--EXPECTF--
+Notice: Object of class stdClass could not be converted to int in %s on line %d
+int(2)
index ee0336392fdb9d413a96a9a4b74c58aea03305ef..4ea738730436b2f75179ae275d9f12fd080118b5 100644 (file)
@@ -308,6 +308,8 @@ int zend_build_cfg(zend_arena **arena, const zend_op_array *op_array, uint32_t b
                                                        flags |= ZEND_FUNC_INDIRECT_VAR_ACCESS;
                                                } else if (zend_string_equals_literal(Z_STR_P(zv), "get_defined_vars")) {
                                                        flags |= ZEND_FUNC_INDIRECT_VAR_ACCESS;
+                                               } else if (zend_string_equals_literal(Z_STR_P(zv), "assert")) {
+                                                       flags |= ZEND_FUNC_INDIRECT_VAR_ACCESS;
                                                } else if (zend_string_equals_literal(Z_STR_P(zv), "func_num_args")) {
                                                        flags |= ZEND_FUNC_VARARG;
                                                } else if (zend_string_equals_literal(Z_STR_P(zv), "func_get_arg")) {