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

use*_*484 1 c signals compiler-optimization

#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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

R..*_*R.. 5

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

7.14.1.1信号功能

[...]

5如果信号的出现不是调用abort或raise函数的结果,那么如果信号处理程序引用具有静态或线程存储持续时间但不是无锁原子对象的任何对象,则行为是未定义的,除非通过分配声明为volatile sig_atomic_t的对象的值,或者......

POSIX可能会(可能的未来方向,尚未决定)在略微放松的条件下定义行为; 在某种意义上,它错误地已经通过使用AS安全功能的漏洞做了.我在Austin Group问题跟踪器上有关于此主题的公开问题:

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