参数声明为restrict和编译器警告

jch*_*jch 14 c c99 restrict c11 restrict-qualifier

gcc 5和clang 3.6都不会在restrict限定符的约束被违反的情况下发出警告,即使在调用时也是如此-Wall.请考虑以下代码片段:

extern void f(char *restrict p, char *restrict q);

void g(char *p)
{
    f(p, p);
}
Run Code Online (Sandbox Code Playgroud)

天真地,我希望可以静态地确定违规行为,我期待这-Wall会发出警告.我在某个地方错过了一面旗帜,还是在发出一些我没有看到警告的问题?

jch*_*jch 12

从版本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);
     ^
Run Code Online (Sandbox Code Playgroud)