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