А почему? Что-то не могу увидеть. Вроде же state этот не приравнивается ни к чему, чтобы это утверждать.viiv писал(а):(pcb->state == LISTEN) всегда false?
Вопросы по С/С++ (СИ)
- WiseLord
- Друг Кота
- Сообщения: 4905
- Зарегистрирован: Чт апр 11, 2013 11:19:59
- Откуда: Минск
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
Re: Вопросы по С/С++ (СИ)
Положите дивный макрос по месту в развернутом виде. Это к вопросу о "немного замаскировали". Замаскировали там не "немного", а по самое небалуйся.
- WiseLord
- Друг Кота
- Сообщения: 4905
- Зарегистрирован: Чт апр 11, 2013 11:19:59
- Откуда: Минск
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
КодРазворачивается в такое:Всё равно пока криминала не вижу.
Спойлер
Код: Выделить всё
enum tcp_state {
CLOSED = 0,
LISTEN = 1,
....
};
#define LWIP_ERROR(message, expression, handler) do { if (!(expression)) { \
LWIP_PLATFORM_ERROR(message); handler;}} while(0)
struct tcp_pcb *
tcp_listen_with_backlog_and_err(struct tcp_pcb *pcb, u8_t backlog, err_t *err)
{
....
LWIP_ERROR("tcp_listen: pcb already connected",
pcb->state == CLOSED,
res = ERR_CLSD; goto done);
/* already listening? */
if (pcb->state == LISTEN) {
lpcb = (struct tcp_pcb_listen*)pcb;
res = ERR_ALREADY;
goto done;
}
....
}Спойлер
Код: Выделить всё
struct tcp_pcb *
tcp_listen_with_backlog_and_err(struct tcp_pcb *pcb, u8_t backlog, err_t *err)
{
....
do {
if (!(pcb->state == CLOSED)) {
LWIP_PLATFORM_ERROR("tcp_listen: pcb already connected"); res = ERR_CLSD; goto done;}
} while(0)
/* already listening? */
if (pcb->state == LISTEN) {
lpcb = (struct tcp_pcb_listen*)pcb;
res = ERR_ALREADY;
goto done;
}
....
}Re: Вопросы по С/С++ (СИ)
Развернуть надо было по нормальному.
Внимательно посмотрите на то, что в скобках обоих условных операторов. Подумайте, выполнится ли когда-нибудь блок второго ифа.
Код: Выделить всё
if (pcb->state != CLOSED)) {
LWIP_PLATFORM_ERROR("tcp_listen: pcb already connected");
res = ERR_CLSD;
goto done;
}
/* already listening? */
if (pcb->state == LISTEN) {
lpcb = (struct tcp_pcb_listen*)pcb;
res = ERR_ALREADY;
goto done;
}
- WiseLord
- Друг Кота
- Сообщения: 4905
- Зарегистрирован: Чт апр 11, 2013 11:19:59
- Откуда: Минск
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
Хм.. а слона-то я и не заметил...
Получается, при CLOSED выполнится код после приведённого кода, а при любом другом - вообще никакой, сразу в :done уходим.
Тогда да, второе условие не то что не ложно-истинно, а просто всегда пропускается.
Получается, при CLOSED выполнится код после приведённого кода, а при любом другом - вообще никакой, сразу в :done уходим.
Тогда да, второе условие не то что не ложно-истинно, а просто всегда пропускается.
Re: Вопросы по С/С++ (СИ)
Это и есть "pcb->state == LISTEN всегда false". Теперь еще осталось особо продвинутым наконец понять, что это далеко не "забавное решение очевидной каждому практикующему ситуации", а говнокод, преотвратительнейший во всем своем убогом уродстве.
- WiseLord
- Друг Кота
- Сообщения: 4905
- Зарегистрирован: Чт апр 11, 2013 11:19:59
- Откуда: Минск
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
Вообще-то pcb->state == LISTEN вполне может быть и true. Просто до этой проверки дело никогда не дойдёт.
Re: Вопросы по С/С++ (СИ)
Имелось ввиду, что в случаях, когда выполнение доходит до второго ифа, условие (pcb->state == LISTEN) всегда ложно.
Re: Вопросы по С/С++ (СИ)
[uquote="a5021",url="/forum/viewtopic.php?p=3490060#p3490060"]Замаскировали там не "немного", а по самое небалуйся.[/uquote]
Ну да, ну да, ASSERT-логику "замаскировали". Условие (state == CLOSED) обязано выполняться - иначе с воплями на выход. А если пациент не умеет инструментом пользоваться и предполагает в state после этого что-то другое - кто-же ему доктор? Макросы ведь неспроста огромными буквами прописывают - а чтобы клиент понимал что ЭТО_ОПАСТНО!
Впрочем, вспоминая за многозадачность, я бы не был так уверен в однозначном поведении state ....
Но пример хороший, благодарю!
Ну да, ну да, ASSERT-логику "замаскировали". Условие (state == CLOSED) обязано выполняться - иначе с воплями на выход. А если пациент не умеет инструментом пользоваться и предполагает в state после этого что-то другое - кто-же ему доктор? Макросы ведь неспроста огромными буквами прописывают - а чтобы клиент понимал что ЭТО_ОПАСТНО!
Но пример хороший, благодарю!
Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR! 
Re: Вопросы по С/С++ (СИ)
[uquote="Siarzhuk",url="/forum/viewtopic.php?p=3491720#p3491720"]Ну да, ну да, ASSERT-логику "замаскировали". Условие (state == CLOSED) обязано выполняться - иначе с воплями на выход.[/uquote]
Вы только что вляпались самым неприглядным образом. Самое время вернуть вам ваши вопросы: "Проблема-то в чём? Непривычно? Непонятно? Скрытая функциональность? Неочевидные проблемы при выполнении?"
(state == CLOSED) -- это недопустимое для нормального work-flow состояние. В этом случае надлежит "с воплями на выход", а не "иначе".
Одно хорошо -- утверждая, что сей говнокод замечателен, вы вляпались на одном и том же месте дважды, так до конца и не разглядев проблемы даже после того, как здесь все было разжевано. На вашем личном примере вы показали, что недооценивая свойства говнокогда в одну и ту же какаху можно вступать и дважды и трижды и сколько захочется.
Вы только что вляпались самым неприглядным образом. Самое время вернуть вам ваши вопросы: "Проблема-то в чём? Непривычно? Непонятно? Скрытая функциональность? Неочевидные проблемы при выполнении?"
(state == CLOSED) -- это недопустимое для нормального work-flow состояние. В этом случае надлежит "с воплями на выход", а не "иначе".
Одно хорошо -- утверждая, что сей говнокод замечателен, вы вляпались на одном и том же месте дважды, так до конца и не разглядев проблемы даже после того, как здесь все было разжевано. На вашем личном примере вы показали, что недооценивая свойства говнокогда в одну и ту же какаху можно вступать и дважды и трижды и сколько захочется.
Re: Вопросы по С/С++ (СИ)
[uquote="a5021",url="/forum/viewtopic.php?p=3491754#p3491754"](state == CLOSED) -- это недопустимое для нормального work-flow состояние. В этом случае надлежит "с воплями на выход", а не "иначе".[/uquote]
хм. текстгов не смотрел
но по названию фунции (state == CLOSED) как раз единственоое нормальное "work-flow состояние". если сотсояние, отличное от CLOSED - нафик идем, так как уже используется
хм. текстгов не смотрел
Re: Вопросы по С/С++ (СИ)
Тут часть участников обсуждения слепые? И код res = ERR_CLSD; тоже характерен для "единственного нормального" ? Ай да говнокодище! Извалялись все.
Re: Вопросы по С/С++ (СИ)
[uquote="a5021",url="/forum/viewtopic.php?p=3491800#p3491800"]Тут часть участников обсуждения слепые? И код res = ERR_CLSD; тоже характерен для "единственного нормального" ? Ай да говнокодище! Извалялись все.[/uquote]
Да, я слепой. На код возврата, даже не обратил внимание.
Обычно, код возврата, отличный от "все-хорошо" ни на что не влияет (раззве что, на выдачу логов). Поэтому при беглом просмотре, на "такие мелочи" не сильно обращаю внимание. Несомненно, здесь вместо res = ERR_CLSD должно быть что-то вроеде res = ERR_ALREADY_USED (не смотрел, какие у них коды возврата).
Но по названию функции и логике TCP, данная функция должна переключить состояние CLOSED-->LISTEN, если было !CLOSED - вывалиться с ошибкой. Я бы вообще туда assert врубил бы, нефига уже используемый pcb пытаться перевести в LISTEN состояние, это проблема того кто вызывает данную функцию.
Вы абсолютно правы, это вовсе не "мелочи", а запутывание читателя кода по полной программе. Многовато "плюх" в нескольких строках. Что же там в осталном коде? Говнокод? Может быть.
Но лично я не столь категоричен к этому проекту.
1) Как-то оно, наверное, работает. Я не использовал, точно сказать не могу - иногда вижу (на форумах, ...) что исползуют. Всякие там CubeMX под него генерят, FreeRTOS, вроде, тоже его использует.... Отсюда я делаю вывод, что используют и как-то этот код работает.
Код свободен (у lwIP-а BSD-модифицированная лицензия). Я вообще считаю "чудом", что появляются (и самое главное, работают) подобные открытые проекты. Много ли альтернатив у lwIP-а с BSD-лицензией? А красиво-написанных, не "говнокодов"?
2) Да, в нескольких строках кода две проблемы, но они ни к чему ужасному не приводят (да, "болтается" в коде проверка на LISTEN, которая никогда не сработает; да, не тот код возврата при !CLOSED). Может поэтому и не нашли эти ошибки, что они "почти" никак не проявляются.
3) "Мы рождены, чтоб сказку сделать былью". Если я буду использовать lwIP, попробую commit получить и буду коммитить правки, чтобы проект был лучше. Не дадут коммита - буду тикеты им с патчами присылать. На то он и открытый код, чтобы улучшать его "всем миром"
Надеюсь, что так же будут поступать и другие, кто используют свободный код в своих целях 
Да, я слепой. На код возврата, даже не обратил внимание.
Но по названию функции и логике TCP, данная функция должна переключить состояние CLOSED-->LISTEN, если было !CLOSED - вывалиться с ошибкой. Я бы вообще туда assert врубил бы, нефига уже используемый pcb пытаться перевести в LISTEN состояние, это проблема того кто вызывает данную функцию.
Вы абсолютно правы, это вовсе не "мелочи", а запутывание читателя кода по полной программе. Многовато "плюх" в нескольких строках. Что же там в осталном коде? Говнокод? Может быть.
Но лично я не столь категоричен к этому проекту.
1) Как-то оно, наверное, работает. Я не использовал, точно сказать не могу - иногда вижу (на форумах, ...) что исползуют. Всякие там CubeMX под него генерят, FreeRTOS, вроде, тоже его использует.... Отсюда я делаю вывод, что используют и как-то этот код работает.
Код свободен (у lwIP-а BSD-модифицированная лицензия). Я вообще считаю "чудом", что появляются (и самое главное, работают) подобные открытые проекты. Много ли альтернатив у lwIP-а с BSD-лицензией? А красиво-написанных, не "говнокодов"?
2) Да, в нескольких строках кода две проблемы, но они ни к чему ужасному не приводят (да, "болтается" в коде проверка на LISTEN, которая никогда не сработает; да, не тот код возврата при !CLOSED). Может поэтому и не нашли эти ошибки, что они "почти" никак не проявляются.
3) "Мы рождены, чтоб сказку сделать былью". Если я буду использовать lwIP, попробую commit получить и буду коммитить правки, чтобы проект был лучше. Не дадут коммита - буду тикеты им с патчами присылать. На то он и открытый код, чтобы улучшать его "всем миром"
Re: Вопросы по С/С++ (СИ)
[uquote="a5021",url="/forum/viewtopic.php?p=3491754#p3491754"](state == CLOSED) -- это недопустимое для нормального work-flow состояние. В этом случае надлежит "с воплями на выход", а не "иначе".[/uquote]
Забавное дело, сначала я рассказываю то, что вы уже по-сути разжевали, теперь вы пересказываете то, что я перерассказал. А г-н goldsmith тем временем продолжает в репу гадить.
Добавлено after 11 minutes 9 seconds:
[uquote="viiv",url="/forum/viewtopic.php?p=3492185#p3492185"]FreeRTOS, вроде, тоже его использует....[/uquote]
Они свою FreeRTOS+TCP наконец до stable довели и продвигают.
Забавное дело, сначала я рассказываю то, что вы уже по-сути разжевали, теперь вы пересказываете то, что я перерассказал. А г-н goldsmith тем временем продолжает в репу гадить.
Добавлено after 11 minutes 9 seconds:
[uquote="viiv",url="/forum/viewtopic.php?p=3492185#p3492185"]FreeRTOS, вроде, тоже его использует....[/uquote]
Они свою FreeRTOS+TCP наконец до stable довели и продвигают.
Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR! 
Re: Вопросы по С/С++ (СИ)
Отличная иллюстрация того, как ярый поклонник говнокода в говнокоде же и запутался. При этом продолжает пытаться обвинить в этом кого-то еще.
- Apparatchik
- Держит паяльник хвостом
- Сообщения: 908
- Зарегистрирован: Вс май 23, 2010 13:55:42
- Откуда: Украина, Александрия
Re: Вопросы по С/С++ (СИ)
Можно ли на Си делать так:
и чем это чревато (если учесть что программа для микроконтроллера)?
Код: Выделить всё
void kmp_send(const uint8_t *msg, uint8_t size) {
uint8_t buf[size + 2];
...
}
«И всё-таки она вертится!»
Re: Вопросы по С/С++ (СИ)
На мой взгляд, ни чем.
- Apparatchik
- Держит паяльник хвостом
- Сообщения: 908
- Зарегистрирован: Вс май 23, 2010 13:55:42
- Откуда: Украина, Александрия
Re: Вопросы по С/С++ (СИ)
Лучше поступать так, освобождая оперативку для других функций, или же лучше глобальный буфер "с запасом"? Честно говоря сделал для себя открытие что так можно
, правда выставив стандарт языка C99
«И всё-таки она вертится!»
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
локальный массив будет выделен в области стека, и там может быть максимум 258 байт. если у вас сободно хотя бы 300 байт ОЗУ - никакой принципиальной разницы в работе вы не увидите.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: Вопросы по С/С++ (СИ)
А если эта функция вызвана из 1500 последовательно вызванных функций, в которых в свою очередь тоже выделялись переменные или массивы в стеке? Будет принципиальная разница?ARV писал(а):если у вас сободно хотя бы 300 байт ОЗУ - никакой принципиальной разницы в работе вы не увидите.