php sslbug,PHP错误抑制符(@)导致引用传参失败Bug的分析

看下面的例子:

$array = array(1,2,3);

function add (&$arr) {

$arr[] = 4;

}

add(@$array);

print_r($array);

/**

此时, $array没有改变, 输出:

Array

(

[0] => 1

[1] => 2

[2] => 3

)

*/

add($array);

print_r($array);

/**

不使用错误抑制的情况下, 输出正常:

Array

(

[0] => 1

[1] => 2

[2] => 3

[3] => 4

)

*/

?>

这个问题, 我之前没有遇到过, 所以首先去找找相关资料, 看看有没有现成的答案, Goolge了一番, 发现虽然有人已经向PHP报了类似的Bug:http://bugs.php.net/bug.php?id=47623, 但PHP官方还没有解决, 也没有给出答复.

没办法, 只能自己分析了, 之前我曾经在文章中介绍过错误抑制符的原理( 深入理解PHP原理之错误抑制与内嵌HTML), 从原理上来说, 错误抑制只是修改了error_reporting的level, 按理来说不会影响到上下文之间的函数调用的机制. 只能通过实地试验了.

经过gdb跟踪, 发现在使用了错误移植符以后, 函数调用前的传参opcode不同:

//没有使用错误抑制符的时候

OPCODE = SEND_REF

//使用了错误抑制符号以后

OPCODE = SEND_VAR_NO_RE

问题初步定位了, 但是造成这种差异的原因又是什么呢?

既然OPCODE不同, 那么肯定是在语法分析的阶段, 走了不同的分支了, 想到这一层, 问题也就好定位了,

原来, PHP语法分析阶段, 把形如 “@”+expr的条目, 规约成了expr_without_variable, 而这种节点的意义就是没有变量的值, 也就是字面值, 我们都知道字面值是不能传递引用的(因为它不是变量), 所以, 就会导致这种差异.

具体过程如下:

1. 语法分析阶段:

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 { ....} //错误的走了这个分支

| variable {..... } //正常情况

所以导致在编译期间, 生成了不同的OPCODE, 也导致了问题的表象.

最后, 我已经把原因在PHP的这个bug页做了说明, 有兴趣的可以去看看我的烂英语水平. 最后谢谢cici网友提供的这个有趣的问题.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/420087.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端学习(1410):多人管理30数据分页

// 导入用户集合构造函数 const { User } require(../../model/user);module.exports async (req, res) > {// 接收客户端传递过来的当前页参数let page req.query.page || 1;// 每一页显示的数据条数let pagesize 10;// 查询用户数据的总数let count await User.count…

MongoDB分析工具之三:db.currentOp()

db.currentOp() db.currentOp是个好东西,顾名思义,就是当前的操作。在mongodb中可以查看当前数据库上此刻的操作语句信息,包括insert/query/update/remove/getmore/command等多种操作。直接执行 db.currentOp()一般返回一个空的数组&#xff…

php 添加样式,添加样式到php html电子邮件

我仔细查看了这个问题,我在此发现的是添加以下内容:$headers MIME-Version: 1.0 . "\r\n";$headers . Content-type: text/html; charsetiso-8859-1 . "\r\n";和我想发送一个时事通讯类型的电子邮件,所以造型真的很重要.我观看的所有视频都只是…

前端学习(1411):多人管理31数据分页2

{{extend ./common/layout.art}}{{block main}}<!-- 子模板的相对路径相对的就是当前文件 因为它是由模板引擎解析的 而不是浏览器 -->{{include ./common/header.art}}<!-- 主体内容 --><div class"content">{{include ./common/aside.art}}<d…

软件推广

新闻是按照日历来做主导的&#xff0c;如果做的东西也和最近发生的事情有关的话&#xff0c;契合节假日&#xff08;突然想到春运&#xff09;&#xff0c;曝光率会增加在制作软件的同时就要考虑到如何推广。国内的视频公司在视频前的广告和适合做软件推广。新电影上映&#xf…

php按城市显示搜索结果,搜索结果页(通过数据库搜索)

_z2yJxW">本文档讲的是如何通过直接通过数据库搜索接口模板显示搜索结果页。接口&#xff1a;akcms_page.php一 首先在网站根目录创建一个php文件&#xff0c;文件名随便起比如&#xff1a;db_search.php&#xff0c;内容是&#xff1a;$template search.htm;include …

前端学习(1412):多人管理32修改

const { User } require(../../model/user);module.exports async (req, res) > {// 获取到地址栏中的id参数const { message, id } req.query;// 如果当前传递了id参数if (id) {// 修改操作let user await User.findOne({_id: id});// 渲染用户编辑页面(修改)res.rende…

真正能成功的人,不见得是最聪明的,也小见得是学历最高的,而是最能面对问题、锲而不舍的人。...

要知道&#xff0c;这世界上真正能成功的人&#xff0c;不见得是最聪明的&#xff0c;也小见得是学历最高的&#xff0c;而是最能面对问题、锲而不舍的人。 爸爸以前有个同学&#xff0c;追班上一个女生。这男生很不会说话&#xff0c;他开门见山就对女生讲“我爱你”。 那女生…

前端学习(1413):多人管理33修改2(未能完结)

// 引用expess框架 const express require(express); // 创建博客展示页面路由 const admin express.Router();// 渲染登录页面 admin.get(/login, require(./admin/loginPage));// 实现登录功能 admin.post(/login, require(./admin/login));// 创建用户列表路由 admin.get(…

redis php 性能测试工具,redis性能测试与客户端连接详解

Redis 性能测试(推荐&#xff1a;redis入门教程)语法redis-benchmark [option] [option value]实例实例一以下实例同时执行 1000 个请求来检测性能&#xff1a;$ redis-benchmark -n 1000 -qps: 本地 docker 暂时不支持命令。结果跳过&#xff0c;请自行测试。redis:6379> b…

前端学习(1415):ajax的运行环境

// 引用expess框架 const express require(express); // 处理路径 const path require(path);// 创建网站服务器 const app express();app.use(express.static(path.join(__dirname))); // 监听端口 app.listen(3000); console.log(网站服务器启动成功, 请访问localhost)

Selenium Webdriver ie 浏览器

webDriver 在测试ie 的时候会遇到很多的问题&#xff0c;记录下&#xff1a; 1.需要ie的driver驱动 需要下载 IEDriverServer.exe 并把这个驱动放在系统ie 的文件夹下 C:\Program Files\Internet Explorer 2.启动selenium 的时候需要将浏览器安全设置给取消掉 3.启动的时候还…

SharePoint 跨域还原网站一则

博客地址&#xff1a;http://blog.csdn.net/foxdave源端&#xff1a;执行PowerShell命令备份网站集Backup-SPSite http://server_name/sites/site_name -Path C:\Backup\site_name.bak目的端&#xff1a;执行PowerShell命令还原网站集Restore-SPSite http://server_name/sites/…

前端学习(1417):ajax实现步骤

ajax.js // 引用expess框架 const express require(express); // 处理路径 const path require(path);// 创建网站服务器 const app express(); app.get(/first, (req, res) > {res.send(hello geyao) }) app.use(express.static(path.join(__dirname))); // 监听端口 a…

Java代码块回调,QueueEvent - 队列化执行线程和代码块

QueueEvent队列化执行线程和代码块函数说明1.主要有两个子类&#xff0c;QueueEventThread用来顺序执行线程&#xff0c;QueueEventCode用来顺序执行代码2.可以使用setSpeed()设置执行速率3.enqueue()加入队列4.next()执行队列中的下一个事件5.setSnyc()是否同步执行6.finish()…

数组结对

1.设计思想&#xff1a;测试数组长度的最大范围&#xff0c;测试每个元素是int32 类型的&#xff0c;将数组的长度设为2&#xff0c;第一个数字输入最大位数的数字&#xff0c;查看结果。 2.出现的问题&#xff1a; 测试1000个元素&#xff0c; 测试1000个元素程序没有问题&…

前端学习(1418):服务器响应的数据格式

ajax.js // 引用expess框架 const express require(express); // 处理路径 const path require(path);// 创建网站服务器 const app express(); app.get(/first, (req, res) > {res.send(hello geyao) }) app.get(/responsdate, (req, res) > {res.send({ "name…

IT基础架构规划方案二(计算机系统与机房规划规划)

计算机系统规划 服务器硬件选型规划方案 根据对某集团的实际调研&#xff0c;获取了企业业务应用系统的建设情况&#xff0c;随着企业信息化建设的推进&#xff0c;需要对各种信息化管理系统和应用系统的服务器选型进行选型规划&#xff0c;根据不同的系统对服务器硬件的…

java推送数据给安卓,java – 如何从Firebase推送通知中获取数据并将其显示在Android Activity中?...

对不起这个noob问题,我是android开发的新手.我目前正在开发一个项目,需要向安装了我的应用程序的Android设备发送推送通知.我已经按照firebase的快速入门教程完成了这项工作,并在我的设备上成功收到了通知.问题&#xff1a;如何检索服务器发送的消息并将该消息显示给我的Androi…