LINUX.ORG.RU

История изменений

Исправление monk, (текущая версия) :

Стандарт допускает эквивалентность входящего и исходящего значения указателя. Поэтому тут noalias обделался и не соответствует стандарту.

Хм. Тут юридическая неопределённость. Примерно как в коде

int *q, *p;
p = malloc(sizeof(int));
free(p);
q = malloc(sizeof(int));
*q = 1;
*p = 2;  // здесь UB или нет?
printf("%i %i\n", *p, *q);

Теоретически, malloc может вернуть только что освобождённый адрес (который совпадёт с p), но на практике обращение к p после free всё равно всегда является UB.

Исходная версия monk, :

Стандарт допускает эквивалентность входящего и исходящего значения указателя. Поэтому тут noalias обделался и не соответствует стандарту.

Хм. Тут юридическая неопределённость. Примерно как в коде

void *f(void * p, int n)
{
    free(p);
    return malloc(n);
}

int *q, *p;
p = malloc(sizeof(int));
free(p);
q = malloc(sizeof(int));
*q = 1;
*p = 2;  // здесь UB или нет?
printf("%i %i\n", *p, *q);

Теоретически, malloc может вернуть только что освобождённый адрес (который совпадёт с p), но на практике обращение к p после free всё равно всегда является UB.