1. C++ / Говнокод #21566

    −17

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    #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 Октября 2016

    Комментарии (22) RSS

    • есть кстати и особые sizeof-костыли для говноплюсов, которыми пользуются разрабы хрома, и о которых даже написали в очередной рекламной статье одного статического анализатора

      https://habrahabr.ru/company/pvs-studio/blog/119815/ :

      Вернемся к Chromium. В нем используется такой макрос, который позволяет избежать описанных выше ошибок. Вот его реализация:
      template <typename T, size_t N>
      char (&ArraySizeHelper(T (&array)[N]))[N];
      #define arraysize(array) (sizeof(ArraySizeHelper(array)))


      Идея этого магического заклинания в следующем. Шаблонная функция ArraySizeHelper принимает на вход массив произвольного типа длиной N. При этом функция возвращает массив из элементов 'char' длиной N. Реализация функции отсутствует, так как она не нужна. Для оператора sizeof() достаточно только объявления функции ArraySizeHelper. В макросе 'arraysize' вычисляется размер возвращаемого функцией ArraySizeHelper массива байт. Этот размер и есть количество элементов в массиве, длину которого мы хотим вычислить.
      Ответить
      • Нахуя так? Почему не constexpr функция? Почему не шаблонохуйня с шаблоноконстантой? Почему этот пиздец?
        Ответить
        • constexpr-ы судя по всему не поддерживаются той версией визуалстудии, которая должна это собирать. Та статья за 23 мая 2011, а constexpr умеет только 2015 студия
          Ответить
          • > только 2015 студия
            Говнище бажное. До первых апдейтов было такое ощущение, что какую-то early access игрушку купил.

            З.Ы. Хотя, походу, это с любыми продуктами M$ так - до первого сервис-пака лучше не юзать.
            Ответить
            • > какую-то early access игрушку купил
              Тяжёлое детство, студия вместо игрушек.
              Ответить
              • > студия вместо игрушек
                Ага. Ёбаный cookie-clicker на каждом втором мерже (сотня-другая месседжбоксов с "неизвестной ошибкой").
                Ответить
                • Ты ещё не пробовал черрипикать новые элементы в ClearCrap. Там для добавления одного жалкого файлика надо руками (!) замёржить директорию в диалоговом окошке на голом xlib. Особенно хорошо, когда в ней сотня-другая файлов. Это надо делать, даже если нет никаких конфликтов.
                  Ответить
                  • Ну в TFS (из коробки) мувать файлы тоже только по одному можно (ну или всю папку целиком).

                    Шёл 2016 год...
                    Ответить
    •  
      Ответить
    • > Но как такое вообще может быть?

      если по ошибке подсовываешь этому макросу на вход простой указатель, а не статический массив.
      Ответить
      • Это не очень надежный способ. Если передан указатель на char (на платформе с 64-битными указателями), как оно отличит такой указатель от статического массива из 8 char
        Ответить
        • вся няшная - это ненадежный способ писать программы
          Ответить
        • оно все в принципе не надёжно. почему уже давно и изобретают всякие векторы и списки.
          Ответить
      • Ну с темплейтом, который принимает T[N], вроде нет такого бага? Почему они этот способ не поюзали?
        Ответить
    • ну и срань
      Ответить

    Добавить комментарий