【发布时间】:2011-10-09 03:35:40
【问题描述】:
这个非常简单的 C 程序在使用 valgrind 运行时给我一个分段错误。
正常启动时运行良好。
当您向进程发送 USR1 信号时,它会崩溃。
问题似乎是snprintf 处理浮点值格式的方式,因为如果您使用字符串 (%s) 或 int (%d) 格式参数,它可以正常工作。
附:我知道你不应该在信号处理程序中调用任何 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);
}
【问题讨论】:
-
snprintf在信号处理程序中使用是否安全? -
@mu 这是一个带有信号安全 posix 函数的列表:securecoding.cert.org/confluence/display/seccode/…
-
@RedX:谢谢:“......在 OpenBSD 中是异步安全的,但“可能不在其他系统上”,包括 snprintf(),......”。这个list 也没有提到
snprintf。 -
您有程序的 SEGV(生成
vcore文件)或 valgrind 本身(生成core文件)吗?请使用 gdb 从 vcore 文件中获取回溯:gdb yourprogram vcore.XXXXX;然后bt.
标签: c segmentation-fault printf valgrind