8

Сразу же оговорюсь: я уважаю стандарт :)
"Закон есть закон" (с) Фердинанд Пасторелли

Тем не менее - насколько это серьезно в реальной жизни? Хочется посмотреть на конкретные примеры, где нарушение strict aliasing реально приводит к неприятностям, причем желательно не запутанные примеры с передачей трех разных указателей на одно и то же место в памяти в одну функцию, а что-то типа обнуления массива char через long long?

Еще раз прошу не подозревать в том, что я хочу получить ответ и на его основании наехать на стандарт :)

Harry
  • 221,325

1 Answers1

8

Вот пример:

char const * test(char const * p_data)
{
    reinterpret_cast< int const * & >(p_data) += 1; // пропускаем 4 байта
    return(p_data);
}

-O3

mov rax, rdi

ret

-O3 -fno-strict-aliasing

lea rax, [rdi+4]

ret

Online compiler

user7860670
  • 29,796
  • Да, но стоит написать как p_data = (char const*)((int const *)(p_data) + 1); - и все становится на свои места... Я скорее к тому, что пример кажется достаточно надуманным. Но в любом случае спасибо! – Harry Nov 26 '17 at 09:39
  • 1
    @Harry Пример из реального проекта. А если написать p_data = (char const*)((int const *)(p_data) + 1);, то и нарушения strict aliasing не будет. – user7860670 Nov 26 '17 at 09:50
  • Почему же не будет? Есть доступ по указателю int* к данным типа char. Вполне себе нарушение. – Harry Nov 26 '17 at 11:22
  • 1
    @Harry В данном случае доступа по указателю int * к данным типа char нет. В исходном же примере алиасинг вставляет палки в колеса оттого, что действия производятся над исходным указателем, а не над временным. – user7860670 Nov 26 '17 at 11:41
  • Такая функция использовалась в реальном коде? Она имеет какие-то особые преимущества над чем-то вроде p_data = pdata + sizeof(int)? – wololo Nov 26 '17 at 13:21
  • @wololo Да, использовалась. Кажется в оригинальном коде преимущество было как раз в отсутствии двойного преобразования void * -> target_type * -> void *. Потом исходный указатель стал byte * и сам код стал как вы и написали. – user7860670 Nov 26 '17 at 15:37
  • 2
    Изврат какой-то, просто издевательство над здравым смыслом (и поделом налетевшему на такую ошибку) – avp Nov 26 '17 at 17:41