如果使用valgrind启动,信号处理程序中的snprintf会创建分段错误

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)

mar*_*k4o 1

这是一个 valgrind 错误。它使用未按照 ABI 要求进行 16 字节对齐的堆栈来调用信号处理程序。在 x86_64 上,浮点参数在 XMM 寄存器中传递,该寄存器只能存储在 16 字节对齐的地址处。您可以通过编译 32 位来解决该问题 ( gcc -m32)。

  • @villapx:第一个包含 Linux 修复(bug 280114)的版本是 3.9.0。OS X 修复(错误 254646)位于 3.8.0 中。当前版本是3.11.0。 (2认同)