Поведение ключевого слова restrict
определено в C99 на 6.7.3.1:
Пусть D - объявление обычного идентификатора, обеспечивающего средство обозначение объекта P в качестве ограничивающего указателя указателя на тип T.
Если D появляется внутри блока и не имеет внешнего класса хранения, пусть B обозначает блок. Если D появляется в списке параметров объявления определения функции, пусть B обозначает ассоциированный блок. В противном случае пусть B обозначает блок основного (или блока любая функция вызывается при запуске программы в автономном режиме среда).
В дальнейшем выражение указателя E называется основанным на объекте P if (в некоторой точке последовательности при выполнении B до оценка E), изменяющая P, чтобы указать на копию объекта массива в который он ранее указывал, изменит значение E.119) Примечание. что '' based '' определяется только для выражений с типами указателей.
Во время каждого исполнения B пусть L - любое l-значение, которое имеет & L на основе P. Если L используется для доступа к значению объекта X, то он и X также модифицируется (любыми способами), то следующие применяются требования: T не должно быть const-qualified. Все остальные значения используемый для доступа к значению X, также имеет свой адрес, основанный на P. Каждый доступ, который модифицирует X, рассматривается также для изменения P, для цели этого подпункта. Если P присвоено значение a выражение указателя E, которое основано на другом ограниченном указателе объект P2, связанный с блоком B2, то либо выполнение B2 начинаются до исполнения B, или исполнение B2 должно до назначения. Если эти требования не выполняются, то поведение undefined.
Как и все остальные, мне трудно понять все тонкости этого определения. В качестве ответа на этот вопрос я хотел бы увидеть множество хороших примеров для каждого требования в 4-м абзаце об использовании, которое нарушит это требование. Эта статья:
делает хорошую работу по представлению правил в терминах "компилятор может предположить..."; расширяя этот шаблон и связывая в предположениях, которые может сделать компилятор, и как они не выдерживают, причем каждый пример будет большим.