- 1
- 2
- 3
- 4
- 5
#if !defined(COMPILER_MSVC)
#define ARRAYSIZE(a) \
((sizeof(a) / sizeof(*(a))) / \
static_cast<size_t>(!(sizeof(a) % sizeof(*(a)))))
#endif
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
−17
#if !defined(COMPILER_MSVC)
#define ARRAYSIZE(a) \
((sizeof(a) / sizeof(*(a))) / \
static_cast<size_t>(!(sizeof(a) % sizeof(*(a)))))
#endif
https://github.com/tensorflow/tensorflow/blob/754048a0453a04a761e112ae5d99c149eb9910dd/tensorflow/stream_executor/platform/port.h#L42-L46
Суть этого говновыражения !(sizeof(a) % sizeof(*(a))) судя по всему в том, чтоб оно становилось нулем, если по каким-то причинам размер массива оказывается не кратен размеру элемента этого массива. И тогда эта макропоебень развернется в деление на ноль. Но как такое вообще может быть?
j123123 25.10.2016 19:05 # +1
https://habrahabr.ru/company/pvs-studio/blog/119815/ :
Вернемся к Chromium. В нем используется такой макрос, который позволяет избежать описанных выше ошибок. Вот его реализация:
Идея этого магического заклинания в следующем. Шаблонная функция ArraySizeHelper принимает на вход массив произвольного типа длиной N. При этом функция возвращает массив из элементов 'char' длиной N. Реализация функции отсутствует, так как она не нужна. Для оператора sizeof() достаточно только объявления функции ArraySizeHelper. В макросе 'arraysize' вычисляется размер возвращаемого функцией ArraySizeHelper массива байт. Этот размер и есть количество элементов в массиве, длину которого мы хотим вычислить.
Soul_re@ver 25.10.2016 19:14 # +2
j123123 25.10.2016 20:00 # 0
bormand 25.10.2016 20:43 # +1
Говнище бажное. До первых апдейтов было такое ощущение, что какую-то early access игрушку купил.
З.Ы. Хотя, походу, это с любыми продуктами M$ так - до первого сервис-пака лучше не юзать.
dxd 25.10.2016 20:52 # +1
Тяжёлое детство, студия вместо игрушек.
bormand 25.10.2016 20:56 # +1
Ага. Ёбаный cookie-clicker на каждом втором мерже (сотня-другая месседжбоксов с "неизвестной ошибкой").
CHayT 25.10.2016 21:07 # +3
bormand 25.10.2016 21:09 # +1
Шёл 2016 год...
Soul_re@ver 25.10.2016 19:14 # 0
Dummy00001 25.10.2016 22:16 # 0
если по ошибке подсовываешь этому макросу на вход простой указатель, а не статический массив.
j123123 25.10.2016 22:27 # 0
guest 25.10.2016 22:30 # −1
Dummy00001 25.10.2016 23:07 # 0
bormand 26.10.2016 06:32 # 0
j123123 26.10.2016 20:57 # 0
barop 27.10.2016 00:59 # −62
j123123 27.10.2016 12:31 # 0
huesto 27.10.2016 13:17 # +1
j123123 27.10.2016 13:44 # 0
j123123 27.10.2016 12:57 # 0
// You should only use ARRAYSIZE_UNSAFE on statically allocated arrays.
bormand 27.10.2016 18:22 # 0
Ну а что ты хотел от UNSAFE? Зато хотя бы можно прогрепать по слову UNSAFE и найти все применения...
guest 28.10.2016 10:37 # 0