Edit report at http://bugs.php.net/bug.php?id=52550&edit=1
ID: 52550
User updated by: regehr at cs dot utah dot edu
Reported by: regehr at cs dot utah dot edu
Summary: integer undefined behaviors executed during "make
test"
Status: Analyzed
Type: Bug
Package: *General Issues
Operating System: linux
PHP Version: trunk-SVN-2010-08-06 (snap)
Block user comment: N
New Comment:
Is there a way to attach files here? Anyway I've put a verbose error
log here:
http://www.cs.utah.edu/~regehr/php-trunk-201008060430-errors.txt
Searching for lines containing the string "CLANG UNDEFINED" in this log
should give you the right information.
Previous Comments:
------------------------------------------------------------------------
[2010-08-06 17:43:56] [email protected]
Do you have a way to generate the list with the test case filename that
triggered
the problem?
------------------------------------------------------------------------
[2010-08-06 16:57:55] regehr at cs dot utah dot edu
To reiterate: this isn't static analysis. Our tool runs your code under
your test suite and looks for integer operations that the C standard
tells us are undefined. I manually verified a few more of these
reported bugs and they were also real. Anyway, I leave the rest to you.
Thanks.
------------------------------------------------------------------------
[2010-08-06 16:52:44] regehr at cs dot utah dot edu
Hi Rasmus-- You're right, this overflow is not totally obvious. It
occurs when '2147483647;' is passed to parse_iv2() in this test:
ext/standard/tests/serialize/serialization_miscTypes_001.phpt
The first problem is that the signed add in (result * 10 + cursor)
overflows; the subtraction overflow is secondary. If you re-associate
the expression and instead compute (result * 10 + (cursor - '0')) the
problems go away.
------------------------------------------------------------------------
[2010-08-06 08:33:38] [email protected]
No, it isn't obvious since that line of code is only executed when the
value of
cursor is between '0' and '9'. It would require the argument to
parse_iv2() to be
above MAXINT which re2c checks for earlier.
------------------------------------------------------------------------
[2010-08-06 08:10:22] regehr at cs dot utah dot edu
Hi-- It's not static analysis and there are no false positives. These
behaviors really happen (unless our tool is buggy, of course this is
always possible).
Yes, I should have edited out the undefined behavior that occurred
during conftest.
My copy of var_unserializer.c has this code at line 228:
result = result * 10 + cursor - '0';
It looks to me like "result * 10 + cursor" evaluates to -2147483601 and
then the subtraction overflow occurs. This is not obvious? Anyway,
this is easy to verify: put an appropriate assertion in the code and run
"make test" yourself.
------------------------------------------------------------------------
The remainder of the comments for this report are too long. To view
the rest of the comments, please view the bug report online at
http://bugs.php.net/bug.php?id=52550
--
Edit this bug report at http://bugs.php.net/bug.php?id=52550&edit=1