Псевдонимы указателя на массив - неопределенное поведение?

Вызывает ли следующий код неопределенное поведение (из-за нарушения псевдонима или иным образом)?)

int foo(int (*a)[10], int (*b)[5])
{
    (*a)[5]++;
    return (*b)[0];
}

int x[10];
foo(&x, (int (*)[5])&x[5]);

Обратите внимание, что соответствующий код использует plain int * вместо типов указатель на массив были бы совершенно законными, потому что a и b будут указателями на один и тот же тип и, таким образом, могут быть псевдонимами друг друга.

Изменить: Интересным следствием, если это на самом деле нарушение псевдонима, является то, что это кажется хакерским, но действенным способом получить ограничить семантику до C99. Например:

void some_func(int *aa, int *bb)
{
    int (*a)[1] = (void *)aa;
    int (*b)[2] = (void *)bb;
    /* Now **a and **b can be assumed by the compiler not to alias */
}

Предположительно, если вам нужно для доступа к фактическому массиву по каждому адресу вы можете использовать SIZE_MAX-1 и SIZE_MAX-2 и т. д. в качестве различных размеров.

14
задан R.. 15 August 2011 в 05:20
поделиться