Няшная / Говнокод #10058 Ссылка на оригинал

0

  1. 1
memset(cb->chars, cb->width * cb->height, ' ');

Мой однострочный эпик фейл.

Запостил: bormand bormand, (Updated )

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

    • character buffer
      struct CharBuffer {
          unsigned int width;
          unsigned int height;
          char *chars;
      };
      Ответить
  • Не аллоцирован указатель chars? Другого говна не вижу.
    Ответить
      • Ага. Был бы второй аргумент хотя бы char а не int, компилятор сразу выдал бы предупреждение.
        Ответить
      • И няшаблядский кокомпилятор даже ничего не заподозрил, приводя целое к указателю!
        Ответить
          • Ой, поправочка:
            И няшаблядский кокомпилятор даже ничего не заподозрил, приводя 4байтовое целое к байту!
            Ответить
              • А почему int c, он заполняет по байту же, а не по 4 байта?

                Короче, криворукая няшаблядская библиотека. Кстати, библиотеку можно считать частью компилятора? Ну, чтобы слово "кокомпилятор" было куда ввернуть.
                Ответить
                • В стандартной библиотеке языке С по историческим причнам не бывает параметров типа 'char', 'short', 'float' и т.п. Минимальными типами параметров является 'int' и 'double'. Происходит это потому, что на заре языка С не требовалось предварительного объявления функций с указанием прототипа. Функции можно было вызывать без знания прототипа, что заставляло компилятор "угадывать" фактические типы параметров по типам передаваемых аргументов (и предпологать, что тип возврата - 'int'). При передаче целочисленного аргумента типа 'char', 'short' или 'int' автоматически подразумевалось, что соответствующий параметр имеет тип 'int'. Поэтому в определениях библиотечных функций всегда используются именно те типы параметров, которые "угадает" компилятор при вызове необъявленной функции.

                  Возможность вызова функций без предварительного объявления была исключена в стандарте С99. Но даже стандарт С99 не требует наличия прототипа для вызова функции. Например, для С99 достаточно такого объявления 'memset'
                  void *memset();

                  и функцую уже можно вызывать. При этом компилятор опять же будет "угадывать" типа параметров как описано выше.
                  Ответить
                  • Это первый вывод типов и количества параметров, посоны.
                    Функциональные языки оказались не первыми. А вывод количества параметров функции - функциональные языки до сих пор не осилили.
                    Ответить
      • а если бы вы проверяли свой код PVS-Studio то она бы сразу выдала один из двух warning'ов

        V512 A call of the 'memset' function will lead to underflow of the buffer 'chars'
        V512 A call of the 'memset' function will lead to overflow of the buffer 'chars'

        и вообще это супер анализатор по выявлению ошибок при переносе на x64 или с линуксячьего
        LP64 на вендовый LLP64
        Ответить
  • Это C, детка.

    Какая-нибудь Java просто не дала бы преобразовать int в byte без явного каста.
    Ответить
    • ага, а Reader.read() возвращает int, хотя сам класс читает _символьные_ потоки
      Ответить
          • \0 может быть вполне валидным символом, действительно прочитанным из потока.
            Ответить
              • Не помню где видел, но в каком-то языке при чтении чаровского значения был таки отдельный символ за пределами чара для признака конца файла. Соответственно, в потоке данных этот символ попасться не мог и проблема не существовала. Но подробности вылетели из головы.
                Ответить

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

Семь раз отмерь — один отрежь, guest!

    А не использовать ли нам bbcode?


    8