#include<stdio.h>
void main()
{
int a=5;
int *__restrict p1=&a,*__restrict p2=&a;
printf("%d\n",*p2);
}
为什么这个代码在gcc中编译时没有任何错误,尽管由restrict限定的指针是唯一可以访问它指向的对象的方法?
答案 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
}
}