summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikita Popov <nikic@php.net>2016-05-17 16:13:17 +0200
committerNikita Popov <nikic@php.net>2016-05-17 16:13:17 +0200
commitb65b15c6f470cc3397ff7719d92cecc762c803e9 (patch)
treea6030211c3de8a23f811b9e2a2c4738652b775ea
parent37b1226af16ec2cf95ffb7c2a8158ae064d8bf9d (diff)
downloadphp-git-b65b15c6f470cc3397ff7719d92cecc762c803e9.tar.gz
Mark assert() as INDIRECT_VAR_ACCESS
I don't like this... we may want to detect "obviously not string" operands by checking for the result of a comparison instruction.
-rw-r--r--Zend/tests/assert/indirect_var_access_misoptimization.phpt19
-rw-r--r--ext/opcache/Optimizer/zend_cfg.c2
2 files changed, 21 insertions, 0 deletions
diff --git a/Zend/tests/assert/indirect_var_access_misoptimization.phpt b/Zend/tests/assert/indirect_var_access_misoptimization.phpt
new file mode 100644
index 0000000000..61c193ab60
--- /dev/null
+++ b/Zend/tests/assert/indirect_var_access_misoptimization.phpt
@@ -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)
diff --git a/ext/opcache/Optimizer/zend_cfg.c b/ext/opcache/Optimizer/zend_cfg.c
index ee0336392f..4ea7387304 100644
--- a/ext/opcache/Optimizer/zend_cfg.c
+++ b/ext/opcache/Optimizer/zend_cfg.c
@@ -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")) {