История изменений
Исправление 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.