ограниченность с pre-c99 - PullRequest
2 голосов
/ 07 июня 2009

Учитывая этот код, 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;
}

Это стандартное поведение? Я ожидал, что компилятор, если не будет сказано, предположит, что оба указателя могут быть алиасами.

Ответы [ 3 ]

4 голосов
/ 08 июня 2009

Код, как написано, является абсолютно действительным, в C89 или C99. Это неясно, но компилятору нечего диагностировать, поэтому он не диагностирует.

Если вы использовали C99 и «restrict» для обоих параметров функции, то вы получите ошибку - если ваш компилятор поддерживает C99. AFAIK, ни одна текущая версия MSVC еще не полностью поддерживает C99.

4 голосов
/ 07 июня 2009

Проверить этот ответ .

Попробуйте поставить __ restrict перед параметрами, похоже, единственный найденный способ заставить MSVC выдавать предупреждения.

0 голосов
/ 11 августа 2015

До того, как C99 изобрел квалификатор restrict, некоторые компиляторы C включали опции оптимизации, которые заставляли их делать определенные предположения об использовании указателя; Руководства, которые я видел для таких компиляторов, прямо предупреждали, что такие оптимизации не соответствуют стандартам и могут произвольно приводить к тому, что код, использующий определенные конкретные конструкции, поведение которых определено Стандартом, ведет себя не так как стандарт, так и программист намерения. С точки зрения руководства, оптимизации сказали компилятору скомпилировать подмножество C, которое не определяло поведение определенных угловых случаев, которые были определены в C, но которое позволило бы генерировать более эффективный код для этих случаев. определил.

...