Подтвердить что ты не робот

Почему "volatileQualifiedExpr + volatileQualifiedExpr" не обязательно UB в C, а на С++?

Когда я сегодня читаю C-стандарт, он говорит о побочных эффектах

Доступ к изменчивому объекту, изменение объекта, изменение файла или вызов функции что любая из этих операций является побочным эффектом

и в стандарте С++ говорится

Доступ к объекту, обозначенному изменчивым значением glvalue (3.10), модификацией объекта, вызовом функции ввода-вывода библиотеки или вызовом функции, которая делает любую из этих операций всеми побочными эффектами

Следовательно, поскольку оба запрещают непредсказуемые побочные эффекты на одном и том же скалярном объекте, C допускает следующее, но С++ делает его undefined поведение

int a = 0;
volatile int *pa = &a;

int b = *pa + *pa;

Я правильно читаю спецификации? И в чем причина несоответствия, если да?

4b9b3361

Ответ 1

Я не верю, что в этом отношении существует эффективная вариация между C и С++. Хотя формулировка последовательности меняется, конечный результат одинаков: оба приводят к поведению undefined (хотя C, похоже, указывает, что оценка будет успешной, но с результатом undefined).

В C99 (извините, у него нет C11), в пункте 5.1.2.3.5 указано:

- В точках последовательности летучие объекты стабильны в том смысле, что предыдущие обращения полный и последующий доступ еще не произошли.

В сочетании с вашей цитатой из 5.1.2.3.2 будет указано, что значение pa не будет в стабильном состоянии, по крайней мере, для одного из обращений к pa. Это имеет логичный смысл, поскольку компилятору разрешено оценивать их в любом порядке, только один раз или в одно и то же время (если это возможно). На самом деле это не определяет, что означает стабильное.

В С++ 11 имеется явная ссылка на неэфференциальные произведения в 1.9.13. Тогда в пункте 15 указывается, что такие операции с неоперабельностью в одном и том же операнде undefined. Поскольку поведение undefined может означать, что что-то происходит, возможно, оно сильное, чем C неустойчивое поведение. Однако в обоих случаях нет гарантированного результата вашего выражения.