Страницы

Поиск по вопросам

четверг, 27 февраля 2020 г.

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

#cpp #volatile


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

#include 

volatile 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

Комментариев нет:

Отправить комментарий