Разрешено ли присваивать ограниченный указатель другому указателю и использовать второй указатель для изменения значения?
Соответствует ли следующий метод "ограничить" контракт?
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
).
Нарушение веры, как всегда в таких случаях, должным образом наказывается неопределенным поведением.