Смотрю тут один опенсорсный проектик на гитхабе и понимаю, что в Cisco работают такие же индусы, как и везде (хотя нет, кое-где за такое могут и уебать):
Совершенно шикарны строки со 149 по 155, да и все их многочисленные копипасты. Поневоле задумываешься, как же в принципе может более-менее стабильно работать современный софт и тем более железо, разработанное «клоунами под руководством мартышек».
PS Посмотрел профили указанных в заголовке индусов на линкедине. Сильно опечалился.
А можно подробнее для не сильно опытных? Струтурка там 15 КБ, на стеке не выделишь. Заменить выделение и очистку макросом? Или плохо гонять malloc в каждой функции? В теории можно выделить раз и переиспользовать, но только если функции точно не будут друг друга вызывать.
> 15 КБ, на стеке не выделишь.
И чо? 15 кБ на стеке нормально себя чувствуют (если мы не скатываемся в рекурсивные вызовы, что в данном случае не нужно).
(вопрос о том, нужны ли вообще структуры по 15к, пока опустим)
Гонять malloc вообще плохо — вон там чуть ниже ребята где-то free забыли.
Ну-да, ну-да… А у кого 16 гигов памяти нет — могут идти в жопу?
У кого нет 16 гигов памяти — те пусть задумаются, на кой хер им буфер на 15 кБ.
Пользователь имеет возможность изменить размер буфера?
Все вопросы к Cisco.
Вы же не циско, правда?
Писал, писал и все пропало…
malloc можент вернуть 0 и не проверив это memset обнулит память с нулевого адреса с непредсказуемыми глюками или вылетом сразу, но даже если первый мемсет очистит буфер, что на стеке, что на куче, то следующий с message->data гарантированно пропишет все с нулевого адреса.
> обнулит память с нулевого адреса с непредсказуемыми глюками или вылетом сразу
Второе. Ну если мы о нормальных системах, а не о микроконтроллерах без MMU.
Схренали?
Кто запрещает отобразить соответствующие адреса пространства процесса на реальную память?
Что Linux, что Windows специально не отображают никуда нулевые адреса.
А шо, Cisco IOS базируется на Linux или Windows?
Вообще-то это код не под IOS, а под сетевой симулятор NS-3 — обычную линуксовую программу (хотя какое отношение он может иметь к IOS — это отдельный вопрос).
memset(mcsInfoResp,0x00,sizeof(TlvBuffer));
memset(mcsInfoResp->data,0x00,BUFFER_DATA_MAX_SIZE);
Эта связка в принципе не может работать.
Либо там фуфло, либо его никто никогда не тестировал, либо с нулевой страницей все нормально.
Тем не менее, оно работает (и вторую строчку можно даже выкинуть за ненадобностью).
Я ступил, мне почему-то решилось что data это указатель.
Знаю я тут одного из Unwired Device. Нещадного гнобителя программистов.
Вот тут можно посмотреть качество кода от этой конторки
https://github.com/unwireddevices/lora-mqtt/blob/master/mqtt.c
Строки 499, 500, 502 память выделяется, освобождается в строках 526-528. До кода освобождения памяти есть return.
Про длину функций, форматирование кода вцелом я вообще молчу. Как говорится советскую школу хер пропьешь.
«такие же индусы, как и везде»
А вообще, посмотрел там blame — обычное дело, год назад написано malloc и free, вставляем новый код, про free благополучно забыто. Книжка «почему си гавно», глава первая. Если это все, что удалось найти и предъявить — то вполне себе нормальный код.
C не говно, а инструмент, позволяющий сделать то что ты хочешь, как ты хочешь и когда ты хочешь. А не как во всяких Java, когда объект создается не там, где написано new, а когда захочет Java-машина.
По поводу говнокода от UD, я особо проблем и не искал, так прошелся по malloc/free. Просто ты любишь цитировать товарища Артамонова, вот пожалуйта код от его конторы.
Помню делал когда-то контроллер для SMD-печки с его прошивкой. Тот код не отключал нагреватель после окончания программы, хорошо что вовремя заметил.
Там аффтар забыл одну функцию дописать.
C — это инструмент, позволяющий прицельно выстрелить себе в ногу.