Является ли законным назначать ограниченный указатель на другой указатель и использовать второй указатель для изменения значения?

Соответствует ли следующий метод "ограничительному" контракту?

void fun(int* restrict foo) {
     int* bar = foo + 32;
     for (int i = 0; i < 32; ++i)
         *bar = 0;
}

Мое предположение - нет, но мне нужно уточнение.

Ответ 1

Да, он точно соблюдает контракт.

6.7.3 Типовые классификаторы

8 Объект, к которому осуществляется доступ с помощью restrict -qualified pointer, имеет специальную ассоциацию с этим указателем. Эта ассоциация, определенная в пункте 6.7.3.1 ниже, , требует, чтобы все обращения к этот объект прямо или косвенно использует значение этого конкретного указателя .135)использование ограничителя (например, класс хранения регистров) заключается в содействии оптимизация и удаление всех экземпляров квалификатора из всех преобразований предварительной обработки единицы, составляющие соответствующую программу, не меняют ее значения (т.е. наблюдаемого поведение).

Короче говоря, в точке foo определен (функциональный вызов), foo гарантирован программистом как единственный способ ссылаться на объекты (если они есть) это указывает на.
Таким образом, все остальные выражения, относящиеся к этому объекту, должны быть получены из этого значения указателей (например, bar, которое установлено на foo+32).
Нарушение веры, как всегда в таких случаях, должным образом наказывается поведением undefined.