Proposed Patch: Fix compiler warning in Zend/zend_execute.c
| From: | Ilia Cheishvili | Date: | Tue, 23 Sep 2008 05:02:11 +0000 |
| Subject: | Proposed Patch: Fix compiler warning in Zend/zend_execute.c | ||
| Groups: | php.internals | ||
| Request: | Send a blank email to internals+get-40616@lists.php.net to get a copy of this message | ||
Hi all,
My name is Ilia--I figured that since this is my first patch to the PHP
core, I should refrain from submitting a massive patch and keep it simple.
The patch that I have attached fixes a simple compiler warning within
Zend/zend_execute.c.
The compiler was complaining about comparing signed and unsigned integers.
What I did was wrap the whole block in an if statement that first ensures
that the signed integer in the comparison is greater than or equal to 0 and
then casts it to unsigned and actually does the comparison. Since the
actual comparison logic is checking to see that an unsigned integer is
larger than the one I am casting, this is all safe.
Also, the entire test suite runs fine and the output is unchanged. All in
all, I am confident with it.
After having used PHP for so many years, I'm really excited about finally
having found the time to apply my C knowledge and actually start
contributing back to the project :)
Thanks!
Ilia
Index: zend_execute.c =================================================================== RCS file: /repository/ZendEngine2/zend_execute.c,v retrieving revision 1.716.2.12.2.24.2.36 diff -u -b -r1.716.2.12.2.24.2.36 zend_execute.c --- zend_execute.c 15 Aug 2008 19:47:23 -0000 1.716.2.12.2.24.2.36 +++ zend_execute.c 23 Sep 2008 04:23:24 -0000 @@ -626,7 +626,9 @@ return 0; } - if (T->str_offset.offset >= Z_STRLEN_P(T->str_offset.str)) { + if (Z_STRLEN_P(T->str_offset.str) >= 0) + { + if (T->str_offset.offset >= (unsigned int) Z_STRLEN_P(T->str_offset.str)) { Z_STRVAL_P(T->str_offset.str) = (char *) erealloc(Z_STRVAL_P(T->str_offset.str), T->str_offset.offset+1+1); memset(Z_STRVAL_P(T->str_offset.str) + Z_STRLEN_P(T->str_offset.str), ' ', @@ -634,6 +636,7 @@ Z_STRVAL_P(T->str_offset.str)[T->str_offset.offset+1] = 0; Z_STRLEN_P(T->str_offset.str) = T->str_offset.offset+1; } + } if (Z_TYPE_P(value) != IS_STRING) { zval tmp = *value;
Index: zend_execute.c =================================================================== RCS file: /repository/ZendEngine2/zend_execute.c,v retrieving revision 1.716.2.12.2.24.2.36 diff -u -b -r1.716.2.12.2.24.2.36 zend_execute.c --- zend_execute.c 15 Aug 2008 19:47:23 -0000 1.716.2.12.2.24.2.36 +++ zend_execute.c 23 Sep 2008 04:23:24 -0000 @@ -626,7 +626,9 @@ return 0; } - if (T->str_offset.offset >= Z_STRLEN_P(T->str_offset.str)) { + if (Z_STRLEN_P(T->str_offset.str) >= 0) + { + if (T->str_offset.offset >= (unsigned int) Z_STRLEN_P(T->str_offset.str)) { Z_STRVAL_P(T->str_offset.str) = (char *) erealloc(Z_STRVAL_P(T->str_offset.str), T->str_offset.offset+1+1); memset(Z_STRVAL_P(T->str_offset.str) + Z_STRLEN_P(T->str_offset.str), ' ', @@ -634,6 +636,7 @@ Z_STRVAL_P(T->str_offset.str)[T->str_offset.offset+1] = 0; Z_STRLEN_P(T->str_offset.str) = T->str_offset.offset+1; } + } if (Z_TYPE_P(value) != IS_STRING) { zval tmp = *value;