- 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))) судя по всему в том, чтоб оно становилось нулем, если по каким-то причинам размер массива оказывается не кратен размеру элемента этого массива. И тогда эта макропоебень развернется в деление на ноль. Но как такое вообще может быть?
https://habrahabr.ru/company/pvs-studio/blog/119815/ :
Вернемся к Chromium. В нем используется такой макрос, который позволяет избежать описанных выше ошибок. Вот его реализация:
Идея этого магического заклинания в следующем. Шаблонная функция ArraySizeHelper принимает на вход массив произвольного типа длиной N. При этом функция возвращает массив из элементов 'char' длиной N. Реализация функции отсутствует, так как она не нужна. Для оператора sizeof() достаточно только объявления функции ArraySizeHelper. В макросе 'arraysize' вычисляется размер возвращаемого функцией ArraySizeHelper массива байт. Этот размер и есть количество элементов в массиве, длину которого мы хотим вычислить.
Говнище бажное. До первых апдейтов было такое ощущение, что какую-то early access игрушку купил.
З.Ы. Хотя, походу, это с любыми продуктами M$ так - до первого сервис-пака лучше не юзать.
Тяжёлое детство, студия вместо игрушек.
Ага. Ёбаный cookie-clicker на каждом втором мерже (сотня-другая месседжбоксов с "неизвестной ошибкой").
Шёл 2016 год...
если по ошибке подсовываешь этому макросу на вход простой указатель, а не статический массив.
// You should only use ARRAYSIZE_UNSAFE on statically allocated arrays.
Ну а что ты хотел от UNSAFE? Зато хотя бы можно прогрепать по слову UNSAFE и найти все применения...