> I must have overlooked a detail here.
> 
> According to https://github.com/tpunt/PHP7-Reference#throwable-interface
> there are Throwables called Error, as a separate designation from an
> exception. I didn't see this in the engine exceptions RFC, so I was
> unaware that was even a thing.
> 
> In this case, yes, as long as you can wrap it in try/catch blocks,
> SecurityError which extends Error and/or implements Throwable is an
> excellent suggestion.
> 
> Previously, I thought the suggestion was to stick to triggering errors
> (E_ERROR, E_RECOVERABLE_ERROR, etc.).
> 
> Scott Arciszewski
> Chief Development Officer
> Paragon Initiative Enterprises <https://paragonie.com>
> 
> --
> PHP Internals - PHP Runtime Development Mailing List
> To unsubscribe, visit: http://www.php.net/unsub.php
> 

I believe some were suggesting triggering an E_ERROR, though most E_ERRORs in 
the engine have been replaced with thrown Error exceptions, so I think using 
E_ERROR in this case would be inappropriate.

As I suggested in my prior email, I think throwing an instance of Error would 
be appropriate when the functions random_bytes() and random_int() fail.

There are several conditions that already cause the engine to throw an Error 
(or subclass thereof):

(1)->method(); // Throws Error
declare(strict_types=1); array_map(1, 1); // Throws TypeError
require 'file-with-parse-error.php'; // Throws ParseError
eval("$a[ = 1;"); // Throws ParseError
1 << -1; // Throws ArithmeticError
intdiv(1, 0); // Throws DivisionByZeroError
1 % 0; // Throws DivisionByZeroError

Of particular interest in the above examples is intdiv(), an internal function 
that can throw an instance of Error if the denominator is zero.

I propose that random_bytes() and random_int() should throw an instance of 
Error if the parameters are not as expected or if generating a random number 
fails. (To avoid further debate about a subclass, the function should throw 
just a plain instance of Error, it can always be subclassed later without BC 
concerns).

random_bytes() and random_int() failing closed is very important to prevent 
misguided or lazy programmers from using false in place of a random value. A 
return of false can easily be overlooked and unintentionally be cast to a zero 
or empty string. A thrown instance of Error must be purposely caught and 
ignored to produce the same behavior. As Larry pointed out, it is a very common 
error for programmers to not do a strict check using === against false when 
calling strpos(). 

Does anyone have a strong objection to the above proposal? If not, then I think 
Sammy should update his PRs to throw an Error so they can be merged before the 
next beta release.

Aaron Piotrowski


--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to