Unless the problems mentioned in the email I've quoted below
have been fixed, be glad to be getting an error message. :)
In the past it was quite painful to find all of the places 
where non-variables were used as references.  A big thank
you to whoever added the error message!

Due to the lack of reproducability, I never filed a bug
report for the crashes and corruptions I experienced.  Do
any of the experts out there know if the underlying problems
have been addressed?

Thanks!
Todd

On Thu, 2004-04-08 at 18:53, Todd Ruth wrote:
> I'm not sure if it caused any of the issues either of you spoke of,
> but I can report that PHP does have some pointer problems.  I've
> been putting off this email until I had written up something nicer,
> but it's probably better to just get the word out (assuming this isn't
> already known)...
> 
> PHP has problems related to using a temporary as the source for a
> reference.  An obvious no-no is to write "$x =& NULL;" or
> "$x =& @$y[5];".  These are parse errors.  On the other hand, PHP won't
> complain about:
> 
> function &f() {
>    $y = array();
>    return @$y[5];
> }
> $x =& f();
> 
> It even acts OK.  The above code could be a mistake or it could be
> a misguided attempt at optimization (believing that keeping a ref
> to a temporary is better than setting $x equal to the temporary).
> Maybe there was a desire to modify $y if applicable, but otherwise
> be OK with modifying a temporary.  In any case, if you have a large 
> enough system and code like that lying around, there's a good chance 
> you'll get crashes.  You may not get a crash but instead see unrelated
> data mysteriously changed in functions that get called later.
> There are at least 2 ways to adjust the code above to make PHP
> happy.  One is to remove the "&" in the assignment.  Another is
> to create a "real" temporary variable instead of letting PHP make its
> own temporary.  ie
> 
> function &f() {
>    $y = array();
>    $temp = @$y[5];
>    return $temp;
> }
> $x =& f();
> 
> I've had crashes go away and mysterious data overwrites go away with
> the only change to the system being replacing a piece of code like
> the first block of this email with a piece of code like the second
> block.  This has happened for just about every kind of "=& temp" you
> can think of.  Here are a few examples (in addition to the case above)
> of using temporaries as sources for references.  I think we've had a
> crash / mysterious data overwrite for just about all of these (if not
> all).
> 
> function f1() {
>    $y = 5;
>    return $y;
> }
> $x =& f1();  // Get rid of the & or add an & to f1
> 
> function &f2() {
>    return NULL;   // Get rid of & below or use "$r = NULL; return $r;"
> }
> $x =& f2();
> 
> function g() {
>    return NULL;
> }
> function h(&$x) {
>    $x = 5;
> }
> h(g());
> 
> That last one could use some combination of the above recommendations
> to be fixed.  For the record, I agree that there are few (if any) cases
> where the above code is the best code for a design problem, but I also
> dislike that these code blocks can lead to crashes / corruptions.
> 
> BTW, we have never had a problem with using a temporary reference as
> the source for a non-reference copy.  That is to say the following has
> never caused us a problem:
> 
> function &f() {
>    $y = 5;
>    return $y;
> }
> $x = f();
> 
> Best of luck,
> Todd

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

Reply via email to