Я читаю некоторый исходный код о старом инструменте управления для банковского кассира, написанном c использованием curses, вот некоторые коды, которые я не могу понять:Не могу понять их: бесплатно сразу после malloc; закрыть файл сразу после открытия
main(int argc, char *argv[])
{
int h1, h2;
char *m1, *m2;
char fname[100];
sprintf(fname, "%s/welcome.txt", getenv("xxDIR"));
m1 = malloc(1);
free(m1);
h1 = open(fname, 0);
if (h1>0)
close(h1);
else
fprintf(stderr,"Open first file : %s \n", strerror(errno));
func1(argc, argv);
h2 = open(fname, 0);
if (h2>0)
close(h1);
else
fprintf(stderr,"Open second file : %s \n", strerror(errno));
if (h1!=h2)
{
fprintf(stderr,"File Open/Close Check: h1=%d, h2=%d\n", h1, h2);
}
m2 = malloc(1);
free(m2);
if (m1!=m2)
{
printf("Mem Alloc/Free Check: %ld\n", (long)(m2-m1));
}
exit(0);
}
Как я спросил, почему это бесплатно сразу после malloc и закрыть файл сразу после открытия? И func1 здесь:
func1(int argc, char *argv[])
{
char trad_code[5];
int xx1();
int xx2();
int xx3();
int xx4();
int xx5();
int prt_translate(char *fmt, char *data);
signal(SIGINT, SIG_IGN);
scr_open();
clear();
refresh();
while (scr_kbhit()) scr_getch();
screen_set_function (screen_FUNCID_CONFIRM, xx1);
screen_set_function (screen_FUNCID_SETDATA, xx2);
screen_set_function (screen_FUNCID_GETDATA, xx3);
screen_set_function (screen_FUNCID_FLDIN, xx4);
screen_set_function (screen_FUNCID_FLDOUT, xx5);
prt_set_transfunction (prt_translate);
if (sysinit()!=0)
goto sysexit;
Show_Title();
refresh();
if (Show_Welcome())
goto sysexit;
strcpy(trad_code, "0000");
do_menu("0000", trad_code, xxx);
syskill();
sysexit:
clear();
refresh();
while (scr_kbhit()) scr_getch();
endwin();
return 0;
}
Похоже, что этот код просто выполняет некоторые проверки здравомыслия, чтобы понять, ведет ли среда к ожидаемому пути. В частности, он проверяет, будет ли выделение 1 байта памяти кучи, освобождение его и выделение другого байта, приведет к повторному использованию байта в памяти ('m1 == m2') и аналогичным образом: открытие файла, его закрытие снова и открытие другого будет повторно использовать дескриптор файла ('h1 == h2'). – CherryDT
Ах, не заметил вызова 'func1' в середине. Я думаю, что LP - наполовину правы - я думаю, что речь идет не о взломе (потому что хакеры могут просто освободить свою память и закрыть свои файлы), но проверить, протекает ли 'func1' всякая куча памяти и/или какие-либо файлы. Думаю, 'func1' должен очистить свой материал и не оставлять ничего свисающего. ** ИЗМЕНИТЬ **: Я превращу это в ответ. – CherryDT