реклама на сайте
подробности

 
 
> LwIP это потенциально опасное ПО или нет?, или я неправильно понял и не знаю что и как
AleksBak
сообщение Apr 7 2016, 12:59
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 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 как бы "неполноценно" используется и в ней только что-то одно временно берется и потому все безопасно работает? Спасибо.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
des333
сообщение Apr 8 2016, 07:13
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 129
Регистрация: 19-07-08
Из: Санкт-Петербург
Пользователь №: 39 079



AleksBak:

Представьте, Вам нужно написать функцию, которая будет внутри использовать malloc для выделения памяти.

Но указатель на выделенную память нужно вернуть не через возвращаемое значение, а через один из аргументов функции.

Подумайте, как бы Вы написали такую функцию -- уверен, это поможет найти ответ на Ваш вопрос sm.gif


--------------------
Go to the top of the page
 
+Quote Post
AleksBak
сообщение Apr 8 2016, 07:36
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 132
Регистрация: 6-02-16
Из: г. Баку
Пользователь №: 90 364



Цитата(des333 @ Apr 8 2016, 11:13) *
...
Представьте, Вам нужно написать функцию, которая будет внутри использовать malloc для выделения памяти.
...

malloc-ом я память выделяю и сразу же дальше использую внутри функции. А тут в одной функции выделена память, создана переменная в этой памяти и возвращается указатель на эту созданную переменную. А в вызвавшей функции мы продолжаем обращаться к той переменной несмотря на то, что она когда-то была простой локальной переменной в той функции, а не у нас и не здесь. Так теперь понятно? Это же разные вещи тут. Еще вот объяснение у меня есть - может в этом LwIP не настолько все просто сделано и этот указатель, который возвращается указывает на какую-то особую "LwIP"-овскую суперпамять внутри RAM? Но что-то по коду такого не видно тут такого абсолютно. Надо бы отладчиком посмотреть, что и как когда будет возможность.
Go to the top of the page
 
+Quote Post
des333
сообщение Apr 8 2016, 07:50
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 129
Регистрация: 19-07-08
Из: Санкт-Петербург
Пользователь №: 39 079



Цитата(AleksBak @ Apr 8 2016, 10:36) *
...Так теперь понятно?...

Мне точно понятно, что Вы прочитали не всё моё сообщение sm.gif

Цитата
Но указатель на выделенную память нужно вернуть не через возвращаемое значение, а через один из аргументов функции.

Т.е. цель -- написать функцию-обёртку для malloc, которая будет не просто использовать память, а возвращать её наружу (и именно через аргумент).

Всё-таки советую Вам написать такую функцию sm.gif
А уже потом, если вопросы всё-таки останутся, то обсудить их.


--------------------
Go to the top of the page
 
+Quote Post
AleksBak
сообщение Apr 8 2016, 08:12
Сообщение #5


Частый гость
**

Группа: Участник
Сообщений: 132
Регистрация: 6-02-16
Из: г. Баку
Пользователь №: 90 364



Цитата(des333 @ Apr 8 2016, 11:50) *
...написать функцию-обёртку для malloc, которая будет не просто использовать память, а возвращать её наружу (и именно через аргумент).
Всё-таки советую Вам написать такую функцию sm.gif....

Да я Вам сразу отвечу как бы все это было бы. Что тут размышлять как и чего. Выделил память, ничего бы с ней не делал дальше и тут же вернул бы на нее указатель. И Все. А тут - выделяется память, в ней создается переменная, что-то с ней делается, а потом возвращается указатель на ту переменную, а далее мы у себя опять обращаемся к этой переменной откуда-то в куче (в мусорке), а если еще какую-то функцию вызовем по дороге вдруг неожиданно, то ничего не останется от той переменной в мусорке, но будем все равно к ней обращаться т.к. так учат нас.

Еще добавлю - где-то даже кажется есть строгое указание в рекомендациях, что так делать категорически не рекомендуется. Вот только не помню где это и кто бы подсказал бы тут.
Go to the top of the page
 
+Quote Post
des333
сообщение Apr 8 2016, 08:13
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 1 129
Регистрация: 19-07-08
Из: Санкт-Петербург
Пользователь №: 39 079



Цитата(AleksBak @ Apr 8 2016, 11:12) *
Да я Вам сразу отвечу как бы все это было бы. Что тут размышлять как и чего.


Это Ваш выбор sm.gif

Вы просили помощи, я пытался Вам помочь sm.gif


--------------------
Go to the top of the page
 
+Quote Post
AleksBak
сообщение Apr 8 2016, 08:27
Сообщение #7


Частый гость
**

Группа: Участник
Сообщений: 132
Регистрация: 6-02-16
Из: г. Баку
Пользователь №: 90 364



Цитата(des333 @ Apr 8 2016, 12:13) *
Это Ваш выбор sm.gif

Вы просили помощи, я пытался Вам помочь sm.gif

Ну да - спасибо и на этом. Кстати тут вообще-то ничего не выделяется - в смысле это не какая-то ненужная обертка для функции mallocc как Вы пишите с самого начала, а я пытаюсь Вам отвечать согласно такой теории и в итоге не прав оказываюсь. Здесь просто: 1. создается локальная переменная; 2. что-то делается; 3. и возвращается потом указатель на эту локальную переменную. Вот так правильное описание, что тут происходит.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Apr 8 2016, 08:58
Сообщение #8


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
AleksBak
сообщение Apr 8 2016, 09:21
Сообщение #9


Частый гость
**

Группа: Участник
Сообщений: 132
Регистрация: 6-02-16
Из: г. Баку
Пользователь №: 90 364



Цитата(Сергей Борщ @ Apr 8 2016, 12:58) *
...Потом этот указатель записывается в то место, которое было указано входным параметром...des333.

Ну да - все так. Но этот указатель теперь указывает на переменную в этой куче. И эта переменная-структура (ее объявление см. выше) теперь уже заполнена прямо в этой же функции netconn_accept уже должна быть (!). Если же нет и указатель на нее равен NULL, то произошел дисконнект. А в вызвавшей основной функции мы пользуемся готовыми данными из этой переменной (которая находится в куче и не забываем об этом) и получается, что не имеем права никакую др. лишнюю операцию произвести чтобы не дай бог (ПО ведь тут на божьем слове держится) затереть значение этой переменной в куче. Вот так я понял. Если нет, то конечно сыплю голову пеплом как говорится.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Apr 8 2016, 10:18
Сообщение #10


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
AleksBak
сообщение Apr 8 2016, 10:38
Сообщение #11


Частый гость
**

Группа: Участник
Сообщений: 132
Регистрация: 6-02-16
Из: г. Баку
Пользователь №: 90 364



Цитата(Сергей Борщ @ Apr 8 2016, 14:18) *
Вы, вероятно, неправильно понимаете термин "куча" (heap). Вам не зря про malloc писали. Если память выделена в куче - она зарезервирована и никто ее затереть не сможет, разве что только захочет намеренно испортить, но намеренно можно испортить совершенно любую переменную.

Я думал, что куча это типа мусорки и временно в ней создаем переменную (держим над мусорным ведром пока что), что-то делаем, а на выходе из функции бросаем ее в мусорное ведро (а там внутри что-то типа шреддера стоит и перемалывает это наш мусор). И больше, после выхода из функции, не надо лазить в это мусорное ведро и копаться в нем в поисках еды нашей переменной. Вот так думал если по "колхозному" пояснить. laughing.gif
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 28th June 2025 - 03:42
Рейтинг@Mail.ru


Страница сгенерированна за 0.01512 секунд с 7
ELECTRONIX ©2004-2016