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