pcntl_signal for SIGILL/SIGFPE/SIGSEGV/SIGBUS should add addr as int or string, not double
还没有人认领这个 Issue。
- 主要语言
- C
- 星标
- 40.4k
- 派生
- 8.1k
- 平均合并
- 2 天 13 小时
- 30 天内合并 PR
- 96
描述
Description
add_assoc_double_ex is called in combination with a cast to zend_long - add_assoc_long_ex may have been intended? (There's one question about what's best for how negative zend_longs should be handled (high bit of pointer set), where pointers aren't actually negative) - keeping them negative seems better than sometimes using an int and sometimes using a string.
Motivation: Use 64-bit integers when it can properly represent the value. Don't use doubles when they might lose precision (e.g. virtual memory may allow numbers over the largest integer a double can safely represent?)
(not a priority for me, I'm just really surprised to see a float)
The following code:
<?php // Hackish example of a proof of concept userland signal handler to debug in an emergency,
// note that running any php snippets may fail again or have unexpected effects if php has already segfaulted
pcntl_signal(SIGSEGV, function (...$args) {
echo "In signal handler\n";
flush();
var_dump($args);
flush();
debug_print_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS);
flush();
exit(139);
});
pcntl_async_signals(true);
sleep(20);
// call 'kill -USR1 PID_OF_PHP' to attempt to simulate a segfault
// ext/pcntl/pcntl.c
case SIGILL:
case SIGFPE:
case SIGSEGV:
case SIGBUS:
add_assoc_double_ex(user_siginfo, "addr", sizeof("addr")-1, (zend_long)siginfo->si_addr);
break;
Resulted in this output:
In signal handler
array(2) {
[0]=>
int(11)
[1]=>
array(4) {
["signo"]=>
int(11)
["errno"]=>
int(0)
["code"]=>
int(0)
["addr"]=>
float(4294967486499)
}
}
#0 {closure}(11, Array ([signo] => 11,[errno] => 0,[code] => 0,[addr] => 4294967486499)) called at [/usr/local/tyson/php-src/test.php:12]
But I expected this output instead on 64-bit platforms:
["addr"]=>
int(4294967486499)
PHP Version
5.x-8.3-dev
Operating System
No response
贡献指南
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
调研方向
从 ext/pcntl/pcntl.c 中 issue 所示的 SIGILL、SIGFPE、SIGSEGV 和 SIGBUS 处理开始,然后在 64 位平台上运行提供的 PHP 信号处理器示例。当 addr 值能够安全地表示为整数而不是 double 时,即视为完成;issue 还留下了如何处理最高位已设置的指针对应的负 zend_long 的问题,有待解决。
由索引模型根据 Issue 内容生成。
评估
- 技术栈
- c, php
- 领域
- operating-systems
- Issue 类型
- 缺陷
- 难度
- 3/5
- 预计耗时
- 1-2 天
- 活跃度
- 停滞
- 描述清晰度
- 基本清楚
- 新手友好度
- 42/100