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

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

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

Мое предположение - нет, но мне нужны некоторые разъяснения.

1 ответ

Решение

Да, это конечно уважает контракт.

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

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

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

Другие вопросы по тегам