Re: Refal6 для Linux скомпилирован


Subject: Re: Refal6 для Linux скомпилирован
From: Andrey V Stolyarov (croco@croco.net)
Date: Mon Nov 05 2001 - 20:52:45 MSK


On Mon, 5 Nov 2001, Arkady Klimov wrote:

> | ri скомпилирован, правда, компоновщик выдал предупреждение:
> |
> | rbeval.o: In function `rf_eval':
> | /home/dima/archive/refal/c1/rbeval.c:218: the `gets' function is dangerous and should not be used.
>
> Наверно, надо заменить gets на что-то другое или написать свою.

IMHO, надо использовать fgets. Опасность gets в том, что она, получив
указатель на буфер, будет писать в этот буфер до тех пор, пока не кончится
строка на стандартном потоке ввода (ибо размера буфера не знает).
Соответственно, сколь бы большой буфер мы не завели, всегда можно его
переполнить, передав программе строку бОльшей длины. Это чревато,
например, перезаписью в стеке адреса возврата из функции таким образом,
что управление будет передано куда-то в середину нами же подсунутой строки
(один из наиболее популярных методов хака).

fgets отличается тем, что одним из ее параметров является размер буфера, и
больше она в него записать не попытается.

Замена "не глядя" для фрагмента вида

char buf[NNN];
...
gets(buf);

выглядит так:

char buf[NNN];
...
fgets(buf, sizeof(buf), stdin);

С уважением,
Андрей Столяров



This archive was generated by hypermail 2b25 : Mon Oct 25 2004 - 21:24:59 MSD