参数声明限制和编译器警告
Parameters declared restrict and compiler warnings
gcc 5 和 clang 3.6 都不会在违反 restrict
限定符约束的情况下发出警告,即使使用 -Wall
调用也是如此。考虑以下代码片段:
extern void f(char *restrict p, char *restrict q);
void g(char *p)
{
f(p, p);
}
天真地,我希望可以静态地确定违规情况,并且我希望 -Wall
会发出警告。我是否在某处遗漏了一个标志,或者发出我没有看到的警告有问题?
restrict
关键字是程序员明确保证所讨论的指针不会别名。本质上,它允许编译器省略对那些指针的别名分析,因为程序员已经提供了假定的答案。除了实现更好的优化外,这还可以节省编译时间。在大型程序中,分析可能非常昂贵,因此这本身就可能是一件大事。
所以,我相信你的问题的答案是 "the compilers aren't looking, because the code tells them not to bother"
给定代码:
void test(int *restrict a, int *restrict b, int c)
{
a[0] += b[c];
}
唯一受 restrict
限定符影响的场景是 a==b+c
;
在这种情况下,a
中的指针将用于修改一个对象,该对象是
也通过 b
中不相关的指针访问。在所有其他情况下
将在没有 restrict
的情况下定义,没有被访问的对象
通过 a
也可以通过 b
访问,反之亦然。
编译器可以看到传递的函数 restrict
-
合格的指针参数违反相关规则使用它们
因此可能有助于警告此类违规行为,但编译器不能
查看一个函数将无法知道什么组合
参数将有效或无效。
从版本 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);
^
gcc 5 和 clang 3.6 都不会在违反 restrict
限定符约束的情况下发出警告,即使使用 -Wall
调用也是如此。考虑以下代码片段:
extern void f(char *restrict p, char *restrict q);
void g(char *p)
{
f(p, p);
}
天真地,我希望可以静态地确定违规情况,并且我希望 -Wall
会发出警告。我是否在某处遗漏了一个标志,或者发出我没有看到的警告有问题?
restrict
关键字是程序员明确保证所讨论的指针不会别名。本质上,它允许编译器省略对那些指针的别名分析,因为程序员已经提供了假定的答案。除了实现更好的优化外,这还可以节省编译时间。在大型程序中,分析可能非常昂贵,因此这本身就可能是一件大事。
所以,我相信你的问题的答案是 "the compilers aren't looking, because the code tells them not to bother"
给定代码:
void test(int *restrict a, int *restrict b, int c)
{
a[0] += b[c];
}
唯一受 restrict
限定符影响的场景是 a==b+c
;
在这种情况下,a
中的指针将用于修改一个对象,该对象是
也通过 b
中不相关的指针访问。在所有其他情况下
将在没有 restrict
的情况下定义,没有被访问的对象
通过 a
也可以通过 b
访问,反之亦然。
编译器可以看到传递的函数 restrict
-
合格的指针参数违反相关规则使用它们
因此可能有助于警告此类违规行为,但编译器不能
查看一个函数将无法知道什么组合
参数将有效或无效。
从版本 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);
^