Нашли или выдавили из себя код, который нельзя назвать нормальным,
на который без улыбки не взглянешь?
Не торопитесь его удалять или рефакторить, — запостите его на
говнокод.ру, посмеёмся вместе!
Строки 5-6. Всегда прикалывало. Интерфейсом calloc(num, size) никто не пользуется.
Пару раз в качестве стилевого эксперимента пытался передавать calloc() оба параметра без предварительного умножения, но как-то не прижилось.
PS strcpy() на потенциально двоичные данные? выглядит загадочно. (и да, данные скорее всего двоичные, потому что Z_OK это скорее всего код возврата GNU zip'ного libz.)
Видимо между строками 33 и 34 проебался return compressed.
Вот, кстати, еще красивое говно: функция возвращает то литерал "" (который не надо освобождать) то буфер (который надо освободить). Всё для удобства вызывающего!
> Всё для удобства вызывающего!
Особенно с учетом того, что в начале compressed'а лежит длина, у которой с вероятностью 1/256 (если little-endian архитектура) нолик в первом байте... Как они собираются отличать этот буфер от "" - хуй знает. Скорее всего так:
char *result = stringFromDTM(dtm);
if (result == "") { // не повторяйте это дома!
// ...
}
Теоретически пустая строка в сишечке может быть и нулевым указателем; и указателем на произвольный нулевой байт, лежащий где угодно (который можно сравнивать только через строковые функции); и специально подготовленным указателем на первую нулевую константу исполнимого модуля*, для которой сравнение с "" не лишено смысла.
По-моему, маловато видов пустых строк... Надо ещё что-нибудь добавить.
----- * При включенной оптимизации и при некоторых предположениях о линкере.
> Теоретически пустая строка в сишечке может быть и нулевым указателем Данунахуй? А посоны и не знали.
> указателем на произвольный нулевой байт, лежащий где угодно
Именно так. А вот будет ли этот байт одним и тем же для каждого литерала - знают только линкер и компилятор.
P.S. А еще в древних гцц (3.х) была дурацкая опция -fwritable-strings.
Пару раз в качестве стилевого эксперимента пытался передавать calloc() оба параметра без предварительного умножения, но как-то не прижилось.
PS strcpy() на потенциально двоичные данные? выглядит загадочно. (и да, данные скорее всего двоичные, потому что Z_OK это скорее всего код возврата GNU zip'ного libz.)
Вот, кстати, еще красивое говно: функция возвращает то литерал "" (который не надо освобождать) то буфер (который надо освободить). Всё для удобства вызывающего!
Особенно с учетом того, что в начале compressed'а лежит длина, у которой с вероятностью 1/256 (если little-endian архитектура) нолик в первом байте... Как они собираются отличать этот буфер от "" - хуй знает. Скорее всего так:
По-моему, маловато видов пустых строк... Надо ещё что-нибудь добавить.
-----
* При включенной оптимизации и при некоторых предположениях о линкере.
Данунахуй? А посоны и не знали.
> указателем на произвольный нулевой байт, лежащий где угодно
Именно так. А вот будет ли этот байт одним и тем же для каждого литерала - знают только линкер и компилятор.
P.S. А еще в древних гцц (3.х) была дурацкая опция -fwritable-strings.