Строгое искажение указателя: является доступ через 'энергозависимый' указатель/ссылку решением?

Вслед за определенной проблемой, самоответом и комментариями к нему, я хотел бы понять, является ли это надлежащее решение, обходное решение/взлом или просто неправильно.

А именно, я переписал код:

T x = ...;
if (*reinterpret_cast  (&x) == 0)
  ...

Как:

T x = ...;
if (*reinterpret_cast  (&x) == 0)
  ...

с a volatile спецификатор к указателю.

Позвольте нам просто принять ту обработку T как int в моей ситуации имеет смысл. Делает этот доступ через a volatile ссылка решает проблему искажения указателя?

Для ссылки, от спецификации:

[Примечание: энергозависимый подсказка к реализации для предотвращения агрессивной оптимизации, включающей объект, потому что значение объекта могло бы быть изменено средствами, необнаруживаемыми реализацией. См. 1.9 для подробной семантики. В целом, семантика энергозависимых предназначаются, чтобы быть тем же в C++, как они находятся в C. — заканчивают примечание]

Править:

Вышеупомянутый код действительно решал мою проблему, по крайней мере, на GCC 4.5.

8
задан Community 23 May 2017 в 12:25
поделиться

1 ответ

Volatile не может помочь вам избежать неопределенного поведения здесь. Так что, если это сработает для вас с GCC, это удача.

Предположим, T - POD. Тогда правильный способ сделать это

T x = …;
int i;
memcpy(&i,&x,sizeof i);
if (i==0)
  …

Вот! Нет проблем со строгим алиасингом и с выравниванием памяти. GCC даже обрабатывает memcpy как внутреннюю функцию (в этом случае вызов функции не вставляется).

16
ответ дан 5 December 2019 в 15:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: