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

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

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

Я предполагаю, что нет, но мне нужно некоторое разъяснение.


person Jacko    schedule 25.10.2014    source источник
comment
Пожалуйста, постарайтесь минимизировать примеры, этот, скорее всего, будет эквивалентен: int* bar = foo + 5; {*bar = 0}; ;-)   -  person Ciro Santilli 新疆再教育营六四事件ۍ    schedule 11.07.2015


Ответы (1)


Да, это, безусловно, соблюдает контракт.

6.7.3 Определители типа

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

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

person Deduplicator    schedule 26.10.2014
comment
Браво! Отличное объяснение. - person Jacko; 26.10.2014
comment
Я не думаю, что есть какое-либо требование, чтобы это был единственный способ ссылаться на объекты, а скорее то, что (1) последовательность чтений, сделанных с помощью указателя ограничения или его копии, может быть произвольно перемещена назад во времени до точки где был создан указатель ограничения; (2) последовательность записей, сделанных с помощью указателя ограничения или его копии, может быть произвольно отложена до тех пор, пока исходный указатель ограничения находится в области действия. Если функция получает два указателя restrict в качестве параметров, передача одного и того же адреса обоим будет законной, если ни одна часть объекта, написанная с использованием одного... - person supercat; 17.08.2015
comment
...доступ осуществляется с помощью другого. - person supercat; 17.08.2015