свободный () на стековой памяти

Я поддерживаю некоторый код c Соляриса, и я видел что-то странное, по крайней мере, я думаю, что это:

char new_login[64];
...
strcpy(new_login, (char *)login);
...
free(new_login);

Мое понимание - то, что, так как переменная является локальным массивом, память прибывает из стека и не должна быть освобождена, и кроме того так как никакой malloc/calloc/realloc не использовался, поведение не определено.

Это - система реального времени, таким образом, я думаю, что это - трата циклов. Я пропускаю что-то очевидное?

8
задан kennytm 22 April 2010 в 08:05
поделиться

6 ответов

Вы можете освободить () только то, что получили с помощью функций malloc (), calloc () или realloc (). освобождение чего-либо в стеке приводит к неопределенному поведению, вам повезло, что это не приводит к сбою вашей программы или того хуже.

Считайте это серьезной ошибкой и удалите эту строку как можно скорее.

17
ответ дан 3 November 2019 в 13:09
поделиться

Определенно ошибка. free () ДОЛЖЕН использоваться ТОЛЬКО для памяти, выделенной кучей, если только она не переопределена для выполнения чего-то совершенно другого, что я сомневаюсь в этом.

3
ответ дан 3 November 2019 в 13:09
поделиться

Free () определенно является ошибкой.
Однако, возможно, здесь есть еще одна ошибка:


   strcpy(new_login, (char *)login);

Если функция не педантично подтверждает, что логин состоит из 63 или менее символов с соответствующим нулевым завершением, тогда этот код имеет классический баг переполнения буфера. Если злоумышленник может заполнить логин правильными байтами, они могут перезаписать указатель возврата в стеке и выполнить произвольный код. Одно из решений:

   new_login[sizeof(new_login)-1]='\0';
   strncpy(new_login, (char *)login, sizeof(new_login)-1 );
3
ответ дан 3 November 2019 в 13:09
поделиться

В большинстве случаев вы можете освободить () только что-то, размещенное в куче. См. http://www.opengroup.org/onlinepubs/009695399/functions/free.html .

ОДНАКО: Один из способов сделать то, что вы хотели бы делать, - это использовать область видимости временных переменных, размещенных в стеке. примерно так:

{
char new_login[64];
... /* No later-used variables should be allocated on the stack here */
strcpy(new_login, (char *)login);
}
...
2
ответ дан 3 November 2019 в 13:09
поделиться

Спасибо. Рад видеть, что я не сумасшедший. Кроме того, не было проверки границ для strcpy. Я обычно использую strncpy, чтобы избежать подобных вещей.

1
ответ дан 3 November 2019 в 13:09
поделиться

№ Это ошибка.

Согласно free (3) ....

free () освобождает пространство памяти, на которое указывает ptr, которое должно быть возвращено предыдущим вызовом {{ 1}} malloc (), calloc () или realloc (). В противном случае, или если free (ptr) уже был вызван ранее, возникает неопределенное поведение . Если ptr равен NULL, операция не выполняется.

Итак, в вашей программе происходит неопределенное поведение.

7
ответ дан 3 November 2019 в 13:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: