gcc 5 和 clang 3.6 都不会在restrict
限定符的约束被违反时给出警告,即使在调用时也是如此-Wall
。考虑以下代码片段:
extern void f(char *restrict p, char *restrict q);
void g(char *p)
{
f(p, p);
}
天真地,我希望可以静态确定违规行为,并且我希望这-Wall
会发出警告。我是否错过了某处的标志,或者发出我没有看到的警告是否有问题?
gcc 5 和 clang 3.6 都不会在restrict
限定符的约束被违反时给出警告,即使在调用时也是如此-Wall
。考虑以下代码片段:
extern void f(char *restrict p, char *restrict q);
void g(char *p)
{
f(p, p);
}
天真地,我希望可以静态确定违规行为,并且我希望这-Wall
会发出警告。我是否错过了某处的标志,或者发出我没有看到的警告是否有问题?
从版本 8 开始,gcc 对上述代码给出了有用的警告:
a.c: In function ‘g’:
a.c:5:5: warning: passing argument 1 to restrict-qualified parameter aliases with argument 2 [-Wrestrict]
f(p, p);
^
关键字是程序员明确保证所restrict
讨论的指针没有别名。本质上,它允许编译器省略对这些指针的别名分析,因为程序员已经提供了假定的答案。除了能够实现更好的优化之外,这还可以节省编译时间。在大型程序中,分析可能非常昂贵,因此这本身就是一件大事。
所以,我相信你的问题的答案是,“编译器没有在寻找,因为代码告诉他们不要打扰”
给定代码:
void test(int *restrict a, int *restrict b, int c)
{
a[0] += b[c];
}
受restrict
预选赛影响的唯一情况是a==b+c
;在这种情况下,指针 ina
将用于修改也通过不相关的指针 in 访问的对象b
。在没有 的情况下定义的所有其他情况下,通过 访问的restrict
任何对象都a
不会通过 访问b
,反之亦然。
可以看到传递的函数的编译器restrict
- 限定指针参数使用它们违反了与之相关的规则可能会有助于警告这种违规行为,但无法查看函数的编译器将无法知道哪些组合的论点是有效的还是无效的。