gpt4 book ai didi

c - GCC - 使用 POSIX 信号时优化无效

转载 作者:太空宇宙 更新时间:2023-11-04 00:59:17 25 4
gpt4 key购买 nike

#include <stdlib.h>
#include <stdio.h>
#include <signal.h>

int current = 0;

void sigint_handle(int sig) {
printf("sigint: %d\n", current);
}

int main()
{
sigset(SIGINT, sigint_handle);

while (1) {
current++;
// if (current % 1000000 == 0) printf("hey\n");
}

return 0;
}

使用 GCC 7.2.0 以优化级别 -O0 编译,此代码按预期工作。但是,对于任何其他优化级别,每次发送 sigint 都会打印出 sigint: 0。当输出行未注释时,无论优化如何,它也将正常工作。

我是否遗漏了一些关于信号的信息,这是 gcc 中的错误还是预期的行为(如果是,为什么?)?

最佳答案

从信号处理程序访问静态存储持续时间和类型不是 volatile sig_atomic_t 的对象会导致未定义的行为。其来源是(对于 C11):

7.14.1.1 The signal function

[...]

5 If the signal occurs other than as the result of calling the abort or raise function, the behavior is undefined if the signal handler refers to any object with static or thread storage duration that is not a lock-free atomic object other than by assigning a value to an object declared as volatile sig_atomic_t, or...

POSIX 可能会(可能的 future 方向,尚未确定)在稍微宽松的条件下定义行为;从某种意义上说,它已经通过使用 AS 安全功能的漏洞错误地做到了。我在 Austin Group 问题跟踪器上有一个关于此主题的未解决问题:

http://austingroupbugs.net/view.php?id=728

关于c - GCC - 使用 POSIX 信号时优化无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46935618/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com