Сложение volatile - UB?

128
28 апреля 2019, 17:20

Содержит ли следующая программа UB?

#include <iostream>
volatile int x;
int main() {
  std::cout << (x + x);
}
Answer 1

Да, содержит. Несколько доступов к одному и тому же volatile объекту без упорядочения этих доступов (unsequenced access) - неопределенное поведение.

Доступ к volatile объектам испокон веков является частью наблюдаемого поведения (observable behavior) С++ программы. Поэтому доступ к volatile объекту (даже только на чтение) формально считается побочным эффектом (side effect) содержащего этот доступ выражения. А далее уже работает общая схема: наличие в выражении неупорядоченных побочных эффектов, воздействующих на один и тот же объект - это неопределенное поведение.

[n4659]

4.6 Program execution [intro.execution]

14 Reading an object designated by a volatile glvalue (6.10), modifying an object, calling a library I/O function, or calling a function that does any of those operations are all side effects, which are changes in the state of the execution environment.[...]

17 [...]If a side effect on a memory location (4.4) is unsequenced relative to either another side effect on the same memory location or a value computation using the value of any object in the same memory location, and they are not potentially concurrent (4.7), the behavior is undefined.[...]

В новой структуре документа:
http://eel.is/c++draft/basic.exec#intro.execution-7
http://eel.is/c++draft/basic.exec#intro.execution-10

READ ALSO
Python. char как в С/С++

Python. char как в С/С++

в с++ машина видит char как целочисленный тип и можно просто брать и делать так:

147
Захват глобальных переменных лямбдой

Захват глобальных переменных лямбдой

Как правильно захватывать глобальные переменные в лямбде? Хочу использовать следующим образом, но выдаются предупрежденияКак их подавить?

111
Включить все заголовочные файлы

Включить все заголовочные файлы

Можно ли как-то включить в maincpp все возможные заголовочные файлы языка, чтобы каждый раз не думать, что подключать? Может есть специальный...

164
Чем отличаются функции move и forward?

Чем отличаются функции move и forward?

С функцией move вроде бы всё понятно: она приводит любую ссылку на объект к неконстантной rvalue-ссылке, которая в соответствующем контексте передастся...

138