考虑到这种代码,VC9不检测混叠:

typedef struct { int x, y; } vec_t;

void rotate_cw(vec_t const *from,
               vec_t       *to)
{
        /* Notice x depends on y and vice versa */
        to->x = from->y;
        to->y = -from->x;
}

/* ... */
vec_t a, b;
rotate_cw(&a, &b); /* OK, no aliasing */
rotate_cw(&a, &a); /* FAIL, aliasing is not detected */

显而易见的解决方法是使用一个临时:

void rotate_cw(vec_t const *from,
               vec_t       *to)
{
        int temp = from->x;
        to->x = from->y;
        to->y = -temp;
}

这是标准的行为吗?我期待的是,编译器,除非告诉所以,将承担的两个指针被可能混叠

有帮助吗?

解决方案

查看此答案

尝试把 __restrict 中的参数之前,似乎是发现越来越MSVC得到任何警告的唯一途径任何人。

其他提示

如编写的代码是完全有效的,在C89或C99。它是模糊的,但并没有什么编译器来诊断,所以也没有确诊。

如果您使用的C99和“限制”在功能上的两个参数,那么你会得到一个错误 - 如果你的编译器支持C99。 AFAIK,MSVC的没有当前版本还支持C99充分。

在C99发明了restrict预选赛中,一些C编译器包含这将引导他们做出指针使用某些假设的优化选项;我已经看到了这样的编译器的说明书明确警告说,这样的优化是的符合标准,并使用某些特定的构建体,其行为是由标准定义的,其中是一个方式工作可以任意导致代码相反到标准和程序员的意图。但从本手册来看,优化告诉编译器来编译C的一个子集,它并没有定义在C下定义的某个角落的情况下的行为,而这将允许更高效的代码生成的那些情况下,没有限定。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top