UB

Nov. 24th, 2013 01:55 am
thedeemon: (office)
[personal profile] thedeemon
Слева - результат компенсации движения здорового человека. Справа - результат компенсации движения курильщика.



Не, на самом деле слева - результат компенсации движения, полученный при компиляции программы интеловским компилятором (в Release) или MSVC в режиме Debug, а справа - результат на тех же данных той же программы, собранной MSVC в Release. Глюк исчезает, и результат становится в точности как слева, если в исходнике убрать одно единственное слово. Угадаете, какое?

Date: 2013-11-23 07:22 pm (UTC)
From: [identity profile] zhengxi.livejournal.com
volatile?

Date: 2013-11-23 07:42 pm (UTC)
From: [identity profile] thedeemon.livejournal.com
Нет, но близко. С многопоточностью не связано.

Date: 2013-11-23 07:51 pm (UTC)
From: [identity profile] lelf.livejournal.com
я надеюсь не register? (static не подходит, restrict никто не использует)

таки restrict

Date: 2013-11-23 08:04 pm (UTC)
From: [identity profile] thedeemon.livejournal.com
А почему никто не использует, кстати?

Я вот на жалобы ICC про то, как потенциальный алиасинг ему жить мешает, купился, попробовал использовать, за что в одном месте и поплатился, поставив его там, где не следовало.

Re: таки restrict

Date: 2013-11-23 08:12 pm (UTC)
From: [identity profile] lelf.livejournal.com
А почему никто не использует, кстати?

Не знают и не умеют? Но это всё мои наблюдения, действительности не соответствующие

Re: таки restrict

Date: 2013-11-23 11:25 pm (UTC)
From: [identity profile] macrop.livejournal.com
нее.. просто в институтах так всех учат..
говорят что пиши не пиши register, компилятор это не фига не смотрит.. он типа умнее всех, умнее нас, и сам всё знает.

А на самом деле как бы и смотрит, просто самим проверять это всем лень.
Edited Date: 2013-11-23 11:26 pm (UTC)

Date: 2013-11-23 07:46 pm (UTC)
From: [identity profile] theiced.livejournal.com
что то связанное с инициализацией нулём.

Date: 2013-11-23 07:51 pm (UTC)
From: [identity profile] thedeemon.livejournal.com
Я тоже сперва так подумал, но нет, все оказалось интереснее, с компиляторозависимостью и наглядным примером undefined behavior.

Date: 2013-11-23 07:49 pm (UTC)
From: [identity profile] mejedi.livejournal.com
restrict?

Интересно, что баг в дебаге, а не в релизе, причем на компиляторе который, оптимизирует хуже, ОБС.

бинго!

Date: 2013-11-23 08:00 pm (UTC)
From: [identity profile] thedeemon.livejournal.com
Баг только в MSVC/Release, в дебаг варианте оба компилятора делают код без глюков.

Совершенно верно, это был __restrict! Небольшой массив float'ов на стеке, который в одном месте использовался как массив float'ов, а рядом - как массив F32vec4 через указатель, на который по ошибке был навешен модификатор __restrict. Нарушение обещания не алиасить вызывает UB, который в данном случае привел к мусору в результирующем буфере.

Re: бинго!

Date: 2013-11-23 08:33 pm (UTC)
From: [identity profile] mejedi.livejournal.com
Кстати на gcc и clang __m128 определяется примерно так, что в моем понимании позволяет легально кастовать указатели на сабж в указатели на флоат и обратно.

typedef float __m128 __attribute__ ((vector_size (16)));

Вобще самобытное восприятие типов в MSVC доставляет. Я как-то обнаружил, что MSVC считает, что int64_t из stdint.h это не то же самое, что long long int (размер совпадает).
Edited Date: 2013-11-23 09:39 pm (UTC)

Re: бинго!

Date: 2013-11-23 09:55 pm (UTC)
From: [identity profile] qehgt.livejournal.com
Значит, типы и правда разные. char/signed char/unsigned char - это три разных типа, к примеру. "long int"/"long long int" тоже всегда будут разные, даже если размер их одинаков.

Re: бинго!

Date: 2013-11-23 10:01 pm (UTC)
From: [identity profile] mejedi.livejournal.com
Угу. Но это делает типы с фиксированным размером из stdint.h бесполезными, когда приходится работать с кодом, который описывает те же самые типы по своему (legacy или по другим причинам).

Date: 2014-01-27 01:50 pm (UTC)
crower: (pic#)
From: [personal profile] crower
Джеб Корлисс в такой неожиданной роли. :)

Date: 2014-01-27 03:22 pm (UTC)
From: [identity profile] thedeemon.livejournal.com
Он самый. :)

Profile

thedeemon: (Default)
Dmitry Popov

December 2025

S M T W T F S
 12 3456
789101112 13
14151617181920
21222324252627
28293031   

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jan. 29th, 2026 12:32 pm
Powered by Dreamwidth Studios