解释为什么代码编译成功?

时间:2015-08-22 14:58:48

标签: c

#include<stdio.h>

void main()
{
    int a=5;
    int *__restrict p1=&a,*__restrict p2=&a;
    printf("%d\n",*p2);
}

为什么这个代码在gcc中编译时没有任何错误,尽管由restrict限定的指针是唯一可以访问它指向的对象的方法?

2 个答案:

答案 0 :(得分:2)

restrict是编译器的提示,没有其他指针可以访问该内存。这并不意味着编译器应该检查是否有另一个指针,这意味着相反:编译器实际上不需要检查它,因为你告诉它没有。

答案 1 :(得分:2)

您的程序实际上有未定义的行为。

标准中没有任何内容(afaik)说误用restrict需要编译器的诊断,而C99标准的6.7.3.1.4部分只说如果你违反了限制使用规则,那么结果是不确定的行为。

从第6.7.3.1.11节开始,他们也给出了这个代码示例:

{
    int * restrict p1;
    int * restrict q1;
    p1 = q1; // undefined behavior
    {
        int * restrict p2 = p1; // valid
        int * restrict q2 = q1; // valid
        p1 = q2; // undefined behavior
        p2 = q2; // undefined behavior
    }
}