#cpp #volatile
Содержит ли следующая программа UB? #includevolatile int x; int main() { std::cout << (x + x); }
Ответы
Ответ 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
Комментариев нет:
Отправить комментарий