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