|
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, 07:36
|
Частый гость
 
Группа: Участник
Сообщений: 132
Регистрация: 6-02-16
Из: г. Баку
Пользователь №: 90 364

|
Цитата(des333 @ Apr 8 2016, 11:13)  ... Представьте, Вам нужно написать функцию, которая будет внутри использовать malloc для выделения памяти. ... malloc-ом я память выделяю и сразу же дальше использую внутри функции. А тут в одной функции выделена память, создана переменная в этой памяти и возвращается указатель на эту созданную переменную. А в вызвавшей функции мы продолжаем обращаться к той переменной несмотря на то, что она когда-то была простой локальной переменной в той функции, а не у нас и не здесь. Так теперь понятно? Это же разные вещи тут. Еще вот объяснение у меня есть - может в этом LwIP не настолько все просто сделано и этот указатель, который возвращается указывает на какую-то особую "LwIP"-овскую суперпамять внутри RAM? Но что-то по коду такого не видно тут такого абсолютно. Надо бы отладчиком посмотреть, что и как когда будет возможность.
|
|
|
|
|
Apr 8 2016, 07:50
|
Профессионал
    
Группа: Свой
Сообщений: 1 129
Регистрация: 19-07-08
Из: Санкт-Петербург
Пользователь №: 39 079

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

|
Цитата(des333 @ Apr 8 2016, 11:50)  ...написать функцию-обёртку для malloc, которая будет не просто использовать память, а возвращать её наружу (и именно через аргумент). Всё-таки советую Вам написать такую функцию  .... Да я Вам сразу отвечу как бы все это было бы. Что тут размышлять как и чего. Выделил память, ничего бы с ней не делал дальше и тут же вернул бы на нее указатель. И Все. А тут - выделяется память, в ней создается переменная, что-то с ней делается, а потом возвращается указатель на ту переменную, а далее мы у себя опять обращаемся к этой переменной откуда-то в куче (в мусорке), а если еще какую-то функцию вызовем по дороге вдруг неожиданно, то ничего не останется от той переменной в мусорке, но будем все равно к ней обращаться т.к. так учат нас. Еще добавлю - где-то даже кажется есть строгое указание в рекомендациях, что так делать категорически не рекомендуется. Вот только не помню где это и кто бы подсказал бы тут.
|
|
|
|
|
Apr 8 2016, 08:27
|
Частый гость
 
Группа: Участник
Сообщений: 132
Регистрация: 6-02-16
Из: г. Баку
Пользователь №: 90 364

|
Цитата(des333 @ Apr 8 2016, 12:13)  Это Ваш выбор  Вы просили помощи, я пытался Вам помочь  Ну да - спасибо и на этом. Кстати тут вообще-то ничего не выделяется - в смысле это не какая-то ненужная обертка для функции mallocc как Вы пишите с самого начала, а я пытаюсь Вам отвечать согласно такой теории и в итоге не прав оказываюсь. Здесь просто: 1. создается локальная переменная; 2. что-то делается; 3. и возвращается потом указатель на эту локальную переменную. Вот так правильное описание, что тут происходит.
|
|
|
|
|
Apr 8 2016, 08:58
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
QUOTE (AleksBak @ Apr 8 2016, 10:27)  3. и возвращается потом указатель на эту локальную переменную. Где? Я вижу, что в процессе "2. что-то делается" в эту локальную переменную заносится указатель на созданный в куче объект. Потом этот указатель записывается в то место, которое было указано входным параметром. Что до вас и пытался донести des333.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Apr 8 2016, 09:21
|
Частый гость
 
Группа: Участник
Сообщений: 132
Регистрация: 6-02-16
Из: г. Баку
Пользователь №: 90 364

|
Цитата(Сергей Борщ @ Apr 8 2016, 12:58)  ...Потом этот указатель записывается в то место, которое было указано входным параметром...des333. Ну да - все так. Но этот указатель теперь указывает на переменную в этой куче. И эта переменная-структура (ее объявление см. выше) теперь уже заполнена прямо в этой же функции netconn_accept уже должна быть (!). Если же нет и указатель на нее равен NULL, то произошел дисконнект. А в вызвавшей основной функции мы пользуемся готовыми данными из этой переменной (которая находится в куче и не забываем об этом) и получается, что не имеем права никакую др. лишнюю операцию произвести чтобы не дай бог (ПО ведь тут на божьем слове держится) затереть значение этой переменной в куче. Вот так я понял. Если нет, то конечно сыплю голову пеплом как говорится.
|
|
|
|
|
Apr 8 2016, 10:18
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
QUOTE (AleksBak @ Apr 8 2016, 11:21)  и получается, что не имеем права никакую др. лишнюю операцию произвести чтобы не дай бог (ПО ведь тут на божьем слове держится) затереть значение этой переменной в куче. Вы, вероятно, неправильно понимаете термин " куча" (heap). Вам не зря про malloc писали. Если память выделена в куче - она зарезервирована и никто ее затереть не сможет, разве что только захочет намеренно испортить, но намеренно можно испортить совершенно любую переменную.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Apr 8 2016, 10:38
|
Частый гость
 
Группа: Участник
Сообщений: 132
Регистрация: 6-02-16
Из: г. Баку
Пользователь №: 90 364

|
Цитата(Сергей Борщ @ Apr 8 2016, 14:18)  Вы, вероятно, неправильно понимаете термин " куча" (heap). Вам не зря про malloc писали. Если память выделена в куче - она зарезервирована и никто ее затереть не сможет, разве что только захочет намеренно испортить, но намеренно можно испортить совершенно любую переменную. Я думал, что куча это типа мусорки и временно в ней создаем переменную (держим над мусорным ведром пока что), что-то делаем, а на выходе из функции бросаем ее в мусорное ведро (а там внутри что-то типа шреддера стоит и перемалывает это наш мусор). И больше, после выхода из функции, не надо лазить в это мусорное ведро и копаться в нем в поисках еды нашей переменной. Вот так думал если по "колхозному" пояснить.
|
|
|
|
Сообщений в этой теме
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          Сергей Борщ 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 Вообще это довольно дерзко, не особо и в С понимая... Apr 8 2016, 14:08 AleksBak Цитата(ar__systems @ Apr 8 2016, 18:08) В... Apr 8 2016, 17:24  ar__systems Цитата(AleksBak @ Apr 8 2016, 12:24) У ме... Apr 9 2016, 20:11  jcxz Цитата(AleksBak @ Apr 8 2016, 23:24) А Вы... Apr 10 2016, 08:18   AleksBak Цитата(jcxz @ Apr 10 2016, 12:18) ...
Дин... Apr 10 2016, 08:31    jcxz Цитата(AleksBak @ Apr 10 2016, 14:31) Что... Apr 10 2016, 08:45     AleksBak Цитата(jcxz @ Apr 10 2016, 12:45) Выделен... Apr 10 2016, 09:19      aaarrr Цитата(AleksBak @ Apr 10 2016, 12:19) Код... Apr 10 2016, 09:29      jcxz Цитата(AleksBak @ Apr 10 2016, 15:19) Поя... Apr 10 2016, 09:32       AleksBak Цитата(jcxz @ Apr 10 2016, 13:32) ...Где ... Apr 10 2016, 10:23        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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|