par*_*val 5 c printf valgrind segmentation-fault
这个非常简单的c程序在使用valgrind运行时会给我一个分段错误.它开始正常时运行良好.将USR1信号发送到进程时会崩溃.
问题似乎是printf处理浮点值格式化的方式,因为如果使用字符串(%s)或int(%d)格式参数,它可以正常工作.
PS我知道你不应该在信号处理程序中调用任何printf系列函数,但仍然为什么它只与valgrind崩溃.
#include <stdio.h>
#include <signal.h>
void sig_usr1(int sig) {
char buf[128];
snprintf(buf, sizeof(buf), "%f", 1.0);
}
int main(int argc, char **argv) {
(void) signal(SIGUSR1, sig_usr1);
while(1);
}
Run Code Online (Sandbox Code Playgroud)
这是一个 valgrind 错误。它使用未按照 ABI 要求进行 16 字节对齐的堆栈来调用信号处理程序。在 x86_64 上,浮点参数在 XMM 寄存器中传递,该寄存器只能存储在 16 字节对齐的地址处。您可以通过编译 32 位来解决该问题 ( gcc -m32
)。
归档时间: |
|
查看次数: |
2135 次 |
最近记录: |