]> granicus.if.org Git - php/commitdiff
MFB: Fixed bug #39018 (Error control operator '@' fails to suppress "Uninitialized...
authorFelipe Pena <felipe@php.net>
Sat, 8 Mar 2008 11:41:35 +0000 (11:41 +0000)
committerFelipe Pena <felipe@php.net>
Sat, 8 Mar 2008 11:41:35 +0000 (11:41 +0000)
Zend/tests/bug39018.phpt [new file with mode: 0644]
Zend/tests/bug39018_2.phpt [new file with mode: 0644]
Zend/zend_execute.c

diff --git a/Zend/tests/bug39018.phpt b/Zend/tests/bug39018.phpt
new file mode 100644 (file)
index 0000000..128f06d
--- /dev/null
@@ -0,0 +1,82 @@
+--TEST--
+Bug #39018 (Error control operator '@' fails to suppress "Uninitialized string offset")
+--FILE--
+<?php
+
+error_reporting(E_ALL);
+
+$a = 'foo';
+$a[11111111111];
+
+$a = '';
+
+$a[0];
+
+print $a[0]; // 12
+
+$a[-11111111111111111111111];
+
+print $a[-11111111111111111111111]; // 16
+
+$a[-0];
+
+$x = 'test';
+
+@$x[4];
+
+@$y = $x[4];
+
+@('a' == $x[4]);
+
+$x[4] == 'a'; // 28
+
+@$x[4] == 'a';
+
+(@$x[4]) == 'a';
+
+($x[4]) == 'a'; // 34
+
+(@($x[4])) == 'a';
+
+(($x[4])) == 'a'; // 38
+
+@($x[4]) == 'a';
+
+($x[4]) == 'a'; // 42
+
+@($x[4] == 'a');
+
+($x[4] == 'a'); // 46
+
+$y = 'foobar';
+
+$y[12.2];
+
+print $y[12.2]; // 52
+
+$y[3.5];
+
+print $y[3.5]; // 56
+
+print "\nDone\n";
+
+?>
+--EXPECTF--
+
+Notice: Uninitialized string offset: 0 in %s on line 12
+
+Notice: Uninitialized string offset: -2147483648 in %s on line 16
+
+Notice: Uninitialized string offset: 4 in %s on line 28
+
+Notice: Uninitialized string offset: 4 in %s on line 34
+
+Notice: Uninitialized string offset: 4 in %s on line 38
+
+Notice: Uninitialized string offset: 4 in %s on line 42
+
+Notice: Uninitialized string offset: 4 in %s on line 46
+
+Notice: Uninitialized string offset: 12 in %s on line 52
+b
+Done
diff --git a/Zend/tests/bug39018_2.phpt b/Zend/tests/bug39018_2.phpt
new file mode 100644 (file)
index 0000000..81831d5
--- /dev/null
@@ -0,0 +1,18 @@
+--TEST--
+Bug #39018 [2] (Error control operator '@' fails to suppress "Uninitialized string offset")
+--FILE--
+<?php
+
+error_reporting(E_ALL);
+
+$foo = 'test';
+$x = @$foo[6];
+
+print @($foo[100] + $foo[130]);
+
+print "\nDone\n";
+
+?>
+--EXPECT--
+0
+Done
index 66a7bb7030b72bcbb9b1b56b899f21f4540f0c9d..5cb9c2f272a1dc69366fd295125832feb45265b3 100644 (file)
@@ -207,7 +207,6 @@ static inline zval *_get_zval_ptr_var(znode *node, temp_variable *Ts, zend_free_
                if (Z_TYPE_P(T->str_offset.str) == IS_STRING) {
                        if (((int)T->str_offset.offset<0)
                                || (Z_STRLEN_P(T->str_offset.str) <= T->str_offset.offset)) {
-                               zend_error(E_NOTICE, "Uninitialized string offset:  %d", T->str_offset.offset);
                                Z_STRVAL_P(ptr) = STR_EMPTY_ALLOC();
                                Z_STRLEN_P(ptr) = 0;
                        } else {
@@ -218,7 +217,6 @@ static inline zval *_get_zval_ptr_var(znode *node, temp_variable *Ts, zend_free_
                } else {
                        if (((int)T->str_offset.offset<0)
                                || (Z_USTRCPLEN_P(T->str_offset.str) <= T->str_offset.offset)) {
-                               zend_error(E_NOTICE, "Uninitialized string offset:  %d", T->str_offset.offset);
                                Z_USTRVAL_P(ptr) = USTR_MAKE("");
                                Z_USTRLEN_P(ptr) = 0;
                        } else {
@@ -1215,6 +1213,9 @@ static void zend_fetch_dimension_address_read(temp_variable *result, zval **cont
                                        dim = &tmp;
                                }
                                if (result) {
+                                       if (Z_LVAL_P(dim) < 0 || Z_UNILEN_P(container) <= Z_LVAL_P(dim)) {
+                                               zend_error(E_NOTICE, "Uninitialized string offset: %ld", Z_LVAL_P(dim));
+                                       }
                                        container = *container_ptr;
                                        result->str_offset.str = container;
                                        PZVAL_LOCK(container);