中文字幕日韩一区二区_国产一区二区av_国产毛片av_久久久久国产一区_色婷婷电影_国产一区二区精品

PHP錯(cuò)誤抑制符(@)導(dǎo)致引用傳參失敗Bug的分析

看下面的例子:
復(fù)制代碼 代碼如下:
<?php
$array = array(1,2,3);
function add (&$arr) {
$arr[] = 4;
}
add(@$array);
print_r($array);
/**
此時(shí), $array沒有改變, 輸出:
Array
(
[0] => 1
[1] => 2
[2] => 3
)
*/
add($array);
print_r($array);
/**
不使用錯(cuò)誤抑制的情況下, 輸出正常:
Array
(
[0] => 1
[1] => 2
[2] => 3
[3] => 4
)
*/
?>

這個(gè)問題, 我之前沒有遇到過, 所以首先去找找相關(guān)資料, 看看有沒有現(xiàn)成的答案, Goolge了一番, 發(fā)現(xiàn)雖然有人已經(jīng)向php報(bào)了類似的Bug:http://bugs.php.NET/bug.php?id=47623, 但php官方還沒有解決, 也沒有給出答復(fù).

沒辦法, 只能自己分析了, 之前我曾經(jīng)在文章中介紹過錯(cuò)誤抑制符的原理( 深入理解php原理之錯(cuò)誤抑制與內(nèi)嵌HTML), 從原理上來說, 錯(cuò)誤抑制只是修改了error_reporting的level, 按理來說不會(huì)影響到上下文之間的函數(shù)調(diào)用的機(jī)制. 只能通過實(shí)地試驗(yàn)了.

經(jīng)過gdb跟蹤, 發(fā)現(xiàn)在使用了錯(cuò)誤移植符以后, 函數(shù)調(diào)用前的傳參opcode不同:
復(fù)制代碼 代碼如下:
//沒有使用錯(cuò)誤抑制符的時(shí)候
OPCODE = SEND_REF
//使用了錯(cuò)誤抑制符號(hào)以后
OPCODE = SEND_VAR_NO_RE

問題初步定位了, 但是造成這種差異的原因又是什么呢?

既然OPCODE不同, 那么肯定是在語(yǔ)法分析的階段, 走了不同的分支了, 想到這一層, 問題也就好定位了,

原來, php語(yǔ)法分析階段, 把形如 “@”+expr的條目, 規(guī)約成了expr_without_variable, 而這種節(jié)點(diǎn)的意義就是沒有變量的值, 也就是字面值, 我們都知道字面值是不能傳遞引用的(因?yàn)樗皇亲兞?, 所以, 就會(huì)導(dǎo)致這種差異.

具體過程如下:
1. 語(yǔ)法分析階段:
復(fù)制代碼 代碼如下:
expr_without_variable:
//...有省略
| '@' { zend_do_begin_silence(&$1 TSRMLS_CC); }
expr { zend_do_end_silence(&$1 TSRMLS_CC); $$ = $3; }
//此處走了ZEND_SEND_VAL分支
non_empty_function_call_parameter_list:
expr_without_variable { ....} //錯(cuò)誤的走了這個(gè)分支
| variable {..... } //正常情況

所以導(dǎo)致在編譯期間, 生成了不同的OPCODE, 也導(dǎo)致了問題的表象.
最后, 我已經(jīng)把原因在php的這個(gè)bug頁(yè)做了說明, 有興趣的可以去看看我的爛英語(yǔ)水平. 最后謝謝cici網(wǎng)友提供的這個(gè)有趣的問題.

php技術(shù)PHP錯(cuò)誤抑制符(@)導(dǎo)致引用傳參失敗Bug的分析,轉(zhuǎn)載需保留來源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 精品视频一区二区 | 国产精品一区在线 | 美女一区 | 午夜资源 | 国产成人精品视频在线观看 | 天天草av| 成人精品国产免费网站 | 午夜小电影| av网站推荐 | 久久久久久久久淑女av国产精品 | 91不卡在线 | 黄色在线免费观看 | 中文字幕电影在线观看 | 欧美a级成人淫片免费看 | 粉嫩粉嫩芽的虎白女18在线视频 | 欧美久久国产精品 | 天天操天天摸天天爽 | 色视频网站在线观看 | 国产亚洲精品久久yy50 | 欧美xxxx性| 性一交一乱一透一a级 | 成人3d动漫一区二区三区91 | 精品99在线 | 欧美日韩亚洲一区 | 久久精品手机视频 | 成人国产一区二区三区精品麻豆 | 国内精品久久久久久影视8 最新黄色在线观看 | 亚洲高清久久 | 欧美精品一区二区三区在线播放 | 爱高潮www亚洲精品 中文字幕免费视频 | 一级做a毛片 | 国产精品自产拍 | 日韩久草 | 亚洲欧美中文日韩在线v日本 | 91久久国产综合久久91精品网站 | 精品三级在线观看 | 国产精品一区在线播放 | 国产中文字幕在线观看 | .国产精品成人自产拍在线观看6 | 欧美精品一级 | 中文字幕精品一区二区三区精品 |