|
LwIP это потенциально опасное ПО или нет?, или я неправильно понял и не знаю что и как |
|
|
|
Apr 7 2016, 12:59
|
Частый гость
 
Группа: Участник
Сообщений: 132
Регистрация: 6-02-16
Из: г. Баку
Пользователь №: 90 364

|
Вот если я скажем делаю так (использую NetConn API): Код struct netconn *conn, *newconn; err_t err, accept_err;
conn = netconn_new(NETCONN_TCP);
while (1) { if (conn != NULL) { err = netconn_bind(conn, NULL, 7000);
if (err == ERR_OK) { netconn_listen(conn);
while (1) { accept_err = netconn_accept(conn, &newconn);
/* Process the new connection. */ if (accept_err == ERR_OK) { ... } } } else { netconn_delete(conn); } } } Т.е. все "по мануалу" и вопросов тут нет. Но вот вопрос такой тут - в функцию netconn_accept(conn, &newconn); я передал указатель на newconn, а эта функция в ответ обновила его значением указателя на свою локальную переменную (как я понял). Т.е. др. словами говоря - она создала внутри у себя какую-то локальную переменную, а потом второй параметр этой самой функции обновила уже новым значением указателя на эту переменную. И как теперь это понимать - ведь та локальная переменная существует в куче, но может же в любой момент времени быть затерта. Т.е. все работает как бы "до поры - до времени" так получается? Пока не "затрется случайно" та локальная переменная другим чем-то в ОЗУ. Или я не так понял? Или тут эта переменная newconn как бы "неполноценно" используется и в ней только что-то одно временно берется и потому все безопасно работает? Спасибо.
|
|
|
|
|
 |
Ответов
|
Apr 8 2016, 17:24
|
Частый гость
 
Группа: Участник
Сообщений: 132
Регистрация: 6-02-16
Из: г. Баку
Пользователь №: 90 364

|
Цитата(ar__systems @ Apr 8 2016, 18:08)  Вообще это довольно дерзко, не особо и в С понимая, вот так сходу брать и обвинять LwIP в глючности. Я бы посоветовал брать за аксиому, что там все правильно, а если вам кажется иначе, искать ошибки в вашем понимании С вообще и программы в частности. А Вы в C понимаете??  Тогда бы и объяснили чего и как . Тут объяснили.  Мне люди тут и объяснили подробно и доходчиво - свое время потратили и ссылку привели и не одну. Вот им сто раз спасибо готов говорить за это (только так и могу - форум ведь все-таки тут). А Вы вот только под конец написали свое мнение по-этому поводу. Резюме так сказать. И что же?  Вот что. А вообще такое предвзятое отношение к этому LwIP у меня не просто так, а вот стал проверять его работу и что-то нестабильной она показалась сильно. Стал изучать потихоньку что и как и вот в этой теме и спросил один из моментов при этом. В разделе "Для начинающих" между прочим. Ну не приходилось мне особо применять динам. выделение памяти (может даже и к лучшему это вообще-то т.к. темный лес еще тот). У меня другой сетевой стек работал месяцами не выключаясь. Больше полгода - точно было, а больше не получилось только потому что отключали для плановой замены буферного акк-ра или когда ремонт делали в комнате. А вот насчет LwIP-а что-то я совсем не уверен, что такое будет. Вообще не уверен. Поживем - увидим как говорится.
|
|
|
|
|
Apr 10 2016, 08:18
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(AleksBak @ Apr 8 2016, 23:24)  А Вы в C понимаете??  Тогда бы и объяснили чего и как . Тут объяснили.  Мне люди тут и объяснили подробно и ... В разделе "Для начинающих" между прочим. Ну не приходилось мне особо применять динам. выделение памяти (может даже и к лучшему это вообще-то т.к. темный лес еще тот). Если Вы не можете разобраться в паре строк простого кода, то очевидно, советовать можно только изучать учебник по си - все остальные советы бессмысленны. Да и разделом Вы ошиблись, тут где-то был раздел "Для совсем начинающих", Вам туда, пока язык не изучите. Динамическим выделением памяти и кучей в исходной функции даже не пахнет. Откуда Вы его постоянно приплетаете? Создаётся впечатление, что Вы не знаете что это такое, как впрочем и что такое "локальная переменная". В исходной функции идёт обычный возврат данных через указатель. Если даже такое не понятно - только учебник.
|
|
|
|
|
Apr 10 2016, 08:31
|
Частый гость
 
Группа: Участник
Сообщений: 132
Регистрация: 6-02-16
Из: г. Баку
Пользователь №: 90 364

|
Цитата(jcxz @ Apr 10 2016, 12:18)  ... Динамическим выделением памяти в исходных функциях даже не пахнет... Что Вы говорите?  Неужели??? Тут значит уже статическое выделение памяти под переменную? Да ну?? Мне тут люди уже ответили и пояснили популярно что и как и где я был не прав. Все я признаю и благодарен им. А Вы можете дальше не пояснять т.к. толку будет абсолютный нуль. Неделю назад Вы конкретно заявили, что STM32F030 это Cortex-M3 серия и что? Запомнил как раз Ваш пост и ник (!). Еще раз повторяю для любителей впустую писать - мне тут все ответили люди и пояснили. Огромное спасибо им. И все. Понятно да?
|
|
|
|
|
Apr 10 2016, 08:45
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(AleksBak @ Apr 10 2016, 14:31)  Что Вы говорите?  Неужели??? Тут значит уже статическое выделение памяти под переменную? Да ну?? Ни динамических ни статических выделений памяти там вообще нет никаких. Ни одного.Цитата(AleksBak @ Apr 10 2016, 14:31)  Неделю назад Вы конкретно заявили, что STM32F030 это Cortex-M3 серия и что? Запомнил как раз Ваш пост и ник (!). Ложь. Cortex-M3 - это не серия (серия чего???), это ядро. И утверждать на каком ядре построен STM32F030 я не мог, так как не знаю этого, и мне это не интересно. PS: Очевидно Вы даже читать не умеете, то что Вам написали.
|
|
|
|
|
Apr 10 2016, 09:19
|
Частый гость
 
Группа: Участник
Сообщений: 132
Регистрация: 6-02-16
Из: г. Баку
Пользователь №: 90 364

|
Цитата(jcxz @ Apr 10 2016, 12:45)  Выделений памяти там вообще нет никаких. Ни одного. ... Поясню как это все работает : Код struct netconn *newconn; тут мы фактически выделили память под структуру типа netconn (ее описание см. тут же в этой теме), а далее тут передаем: sys_arch_mbox_fetch(&conn->acceptmbox, (void **) &newconn, 0);мы ждем прихода элемент в очередь сообщений и как оно там появится, то его содержимое будет скопировано в выделенный буфер под него т.е. по указателю newconn будет скопирована вся такая структура (ее описание см. тут в этой теме). А функция sys_arch_mbox_fetch эта обертка под получение этого элемента очереди в ОС. А насчет ядра и серии - да я очень грубо ошибся и не пойму как такое слово мог написать. Ядро конечно это. Еще какие ошибки у меня тут есть?? Мне значит тогда совсем закопаться и в школу пойти так да? Вот я сижу-пишу как дурак эти строчки, чего-то доказываю, а двое спиногрызов (дети) реально в этот момент меня задалбливают.  Один со своими машинками лезет, а другая чем-то недовольна и кричит громко в ответ.
|
|
|
|
|
Apr 10 2016, 09:32
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(AleksBak @ Apr 10 2016, 15:19)  Поясню как это все работает : Код struct netconn *newconn; тут мы фактически выделили память под структуру типа netconn (ее описание см. тут же в этой теме), а далее тут передаем: sys_arch_mbox_fetch(&conn->acceptmbox, (void **) &newconn, 0);мы ждем прихода элемент в очередь сообщений и как оно там появится, то его содержимое будет скопировано в выделенный буфер под него т.е. по указателю newconn будет скопирована вся такая структура (ее описание см. тут в этой теме). struct netconn *newconn; - это не выделение памяти под структуру, это объявление указателя на структуру. Вот для того, чтобы понять разницу между объектом и указателем на него, Вам и стоит открыть учебник. Никаких копирований содержимого структуры там не может происходить. sys_arch_mbox_fetch просто сохраняет в newconn указатель на некий экземпляр структуры struct netconn (либо сохраняет там NULL). Где этот экземпляр находится, из этого кода неясно. Он может находиться как в динамической памяти так и в статической и даже в автоматической (на стеке). Это узнать можно только смотря код sys_arch_mbox_fetch.
|
|
|
|
|
Apr 10 2016, 10:23
|
Частый гость
 
Группа: Участник
Сообщений: 132
Регистрация: 6-02-16
Из: г. Баку
Пользователь №: 90 364

|
Цитата(jcxz @ Apr 10 2016, 13:32)  ...Где этот экземпляр находится, из этого кода неясно. Он может находиться как в динамической памяти так и в статической и даже в автоматической (на стеке). Это узнать можно только смотря код sys_arch_mbox_fetch. Код u32_t sys_arch_mbox_fetch(sys_mbox_t *mbox, void **msg, u32_t timeout) { void *dummyptr; portTickType StartTime, EndTime, Elapsed;
StartTime = xTaskGetTickCount();
if (msg == NULL) { msg = &dummyptr; }
if (timeout != 0) { if ( pdTRUE == xQueueReceive(*mbox, &(*msg), timeout / portTICK_RATE_MS)) { EndTime = xTaskGetTickCount(); Elapsed = (EndTime - StartTime) * portTICK_RATE_MS;
return (Elapsed); } else // timed out blocking for message { *msg = NULL;
return SYS_ARCH_TIMEOUT; } } else // block forever for a message. { while ( pdTRUE != xQueueReceive(*mbox, &(*msg), portMAX_DELAY)) { } // time is arbitrary EndTime = xTaskGetTickCount(); Elapsed = (EndTime - StartTime) * portTICK_RATE_MS;
return (Elapsed); // return time blocked TODO test } } Тут параметр - timeout передается равным нулю напоминаю. Вообще все это по-хорошему если, то переписать/переделать нужно. А Вы вообще этот NetConn используете? Или кто из зала тут использует? Если посмотреть, то получается что тут по приходу коннекта снаружи, мы получаем из очереди сообщений ОС (xQueueReceive) всю структуру - копированием по указателю в выделенный для этого буфер (т.е по указателю newconn находится выделенный буфер). То что мне нужно учебники читать и в школу идти - это понятно, только не надо это в каждом посту писать. Расслабьтесь. Я вот терплю своих реально спиногрызов же сейчас и пытаюсь их уложить спать (сейчас время).  Посмотрите свысока на ученика более спокойно. Цитата(jcxz @ Apr 10 2016, 13:32)  ... Никаких копирований содержимого структуры там не может происходить. sys_arch_mbox_fetch просто сохраняет в newconn указатель на некий экземпляр структуры struct netconn (либо сохраняет там NULL)... Еще раз коротко поясню (по-моему мнению конечно): там, дальше используется функция ОС (FreeRTOS тут ясень пень) получения элемента из очереди сообщений - функция xQueueReceive. С одновременным удалением этого элемента из очереди. В эту функцию мы должны в 1-ом параметре передать дескриптор очереди, во 2-м параметре передается указатель на область памяти куда будет скопирован элемент, а в третьем параметре передается время ожидания появления этого элемента в очереди (время блокирования задачи) - если этот параметр равен portMAX_DELAY, то ждем бесконечно долго. Я сейчас должен пойти на базар чтобы купить смеситель/гибкий шланг взамен неисправных и меня наверно час 2-3 не будет - поэтому тут еще раз пояснил и дополнил сейчас на всякий случай. Спасибо.
|
|
|
|
Сообщений в этой теме
AleksBak LwIP это потенциально опасное ПО или нет? Apr 7 2016, 12:59 AleksBak Я после того как написал свой вопрос все переживал... Apr 7 2016, 18:22 _NB Цитата(AleksBak @ Apr 7 2016, 20:22) Т.е.... Apr 7 2016, 18:55  AleksBak Цитата(_NB @ Apr 7 2016, 22:55) Она возвр... Apr 8 2016, 03:22   aaarrr Цитата(AleksBak @ Apr 8 2016, 06:22) ...п... Apr 8 2016, 06:23    AleksBak Цитата(aaarrr @ Apr 8 2016, 10:23) Так в ... Apr 8 2016, 07:08 des333 AleksBak:
Представьте, Вам нужно написать функцию... Apr 8 2016, 07:13 AleksBak Цитата(des333 @ Apr 8 2016, 11:13) ...
Пр... Apr 8 2016, 07:36  des333 Цитата(AleksBak @ Apr 8 2016, 10:36) ...Т... Apr 8 2016, 07:50   AleksBak Цитата(des333 @ Apr 8 2016, 11:50) ...нап... Apr 8 2016, 08:12    des333 Цитата(AleksBak @ Apr 8 2016, 11:12) Да я... Apr 8 2016, 08:13     AleksBak Цитата(des333 @ Apr 8 2016, 12:13) Это Ва... Apr 8 2016, 08:27      Сергей Борщ QUOTE (AleksBak @ Apr 8 2016, 10:27) 3. и... Apr 8 2016, 08:58       AleksBak Цитата(Сергей Борщ @ Apr 8 2016, 12:58) .... Apr 8 2016, 09:21        Сергей Борщ QUOTE (AleksBak @ Apr 8 2016, 11:21) и по... Apr 8 2016, 10:18         AleksBak Цитата(Сергей Борщ @ Apr 8 2016, 14:18) В... Apr 8 2016, 10:38          Сергей Борщ QUOTE (AleksBak @ Apr 8 2016, 12:38) Я ду... Apr 8 2016, 10:41 gosha-z Я правильно понимаю, что newconn во втором сообщен... Apr 8 2016, 08:39 AleksBak Цитата(gosha-z @ Apr 8 2016, 12:39) ... Apr 8 2016, 08:56 AleksBak Еще пояснение: newconn - это указатель на область ... Apr 8 2016, 10:31 Сергей Борщ QUOTE (AleksBak @ Apr 8 2016, 12:31) А ес... Apr 8 2016, 10:36  AleksBak Цитата(Сергей Борщ @ Apr 8 2016, 14:36) .... Apr 8 2016, 10:53   Сергей Борщ QUOTE (AleksBak @ Apr 8 2016, 12:53) где-... Apr 8 2016, 10:58  ar__systems Цитата(AleksBak @ Apr 8 2016, 12:24) У ме... Apr 9 2016, 20:11      aaarrr Цитата(AleksBak @ Apr 10 2016, 12:19) Код... Apr 10 2016, 09:29        jcxz Цитата(AleksBak @ Apr 10 2016, 16:23) это... Apr 10 2016, 11:38         AleksBak Цитата(jcxz @ Apr 10 2016, 15:38) Опять 2... Apr 10 2016, 18:25      ar__systems Цитата(AleksBak @ Apr 10 2016, 04:19) Поя... Apr 11 2016, 13:47 gosha-z MailBox - почтовый ящик.
MessageQueue - очередь со... Apr 10 2016, 18:50 AleksBak Опять я ошибся и перепутал - не "очередь сооб... Apr 10 2016, 19:24
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|