From:             php at richardneill dot org
Operating system: All
PHP version:      5.4.12
Package:          Math related
Bug Type:         Feature/Change Request
Bug description:Proposal: deprecate the "leading 0 means octal" behaviour

Description:
------------
PHP assumes that a string with a leading zero should be interpreted as
octal.

In my experience, this is almost never useful, desirable, or intentional,
however, it is a frequent trap for the beginner (or more experienced
programmer), especially when parsing user-submitted data.

The only reason for this behaviour seems to be historical, and
compatibility with strtol(). When non-programmer humans write numbers with
leading zeros, they don't usually mean base 8.

My proposal is:

1. Introduce a new string format, 0o####  (letter o), to explicitly mean
"this is an octal number". This is similar to the recent introduction of
0b#### for binary numbers. 

[This part should be simple to do, and would also make the intentional use
of octal notation explicit, increasing code-readability]


2. Add an option to raise E_NOTICE any time a number is implicitly
interpreted as octal (for example  "$x = 0100").


3. In a few years time, (PHP 7?), it may finally be possible to change the
default behaviour.

Test script:
---------------
Here's an illustration of a naive program that has data-dependent bugs that
are really hard to track down.

$mass_kg = "0.314"      //user-submitted data, known to begin "0."
$mass_g  = substr ($mass_kg, 2);

Yes, this is a silly thing to write. But it's a nasty trap for the unwary.
The above example does what is expected, and might pass many tests. But if
the user subsequently enters $mass_kg = "0.031", this will turn into 25
grams, not 31 grams. As a result, we have created a very subtle and hard to
find bug.




-- 
Edit bug report at https://bugs.php.net/bug.php?id=64320&edit=1
-- 
Try a snapshot (PHP 5.4):   
https://bugs.php.net/fix.php?id=64320&r=trysnapshot54
Try a snapshot (PHP 5.3):   
https://bugs.php.net/fix.php?id=64320&r=trysnapshot53
Try a snapshot (trunk):     
https://bugs.php.net/fix.php?id=64320&r=trysnapshottrunk
Fixed in SVN:               https://bugs.php.net/fix.php?id=64320&r=fixed
Fixed in release:           https://bugs.php.net/fix.php?id=64320&r=alreadyfixed
Need backtrace:             https://bugs.php.net/fix.php?id=64320&r=needtrace
Need Reproduce Script:      https://bugs.php.net/fix.php?id=64320&r=needscript
Try newer version:          https://bugs.php.net/fix.php?id=64320&r=oldversion
Not developer issue:        https://bugs.php.net/fix.php?id=64320&r=support
Expected behavior:          https://bugs.php.net/fix.php?id=64320&r=notwrong
Not enough info:            
https://bugs.php.net/fix.php?id=64320&r=notenoughinfo
Submitted twice:            
https://bugs.php.net/fix.php?id=64320&r=submittedtwice
register_globals:           https://bugs.php.net/fix.php?id=64320&r=globals
PHP 4 support discontinued: https://bugs.php.net/fix.php?id=64320&r=php4
Daylight Savings:           https://bugs.php.net/fix.php?id=64320&r=dst
IIS Stability:              https://bugs.php.net/fix.php?id=64320&r=isapi
Install GNU Sed:            https://bugs.php.net/fix.php?id=64320&r=gnused
Floating point limitations: https://bugs.php.net/fix.php?id=64320&r=float
No Zend Extensions:         https://bugs.php.net/fix.php?id=64320&r=nozend
MySQL Configuration Error:  https://bugs.php.net/fix.php?id=64320&r=mysqlcfg

Reply via email to