2016-05-04 1 views
3

Я читаю некоторый исходный код о старом инструменте управления для банковского кассира, написанном 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

Похоже, что этот код просто выполняет некоторые проверки здравомыслия, чтобы понять, ведет ли среда к ожидаемому пути. В частности, он проверяет, будет ли выделение 1 байта памяти кучи, освобождение его и выделение другого байта, приведет к повторному использованию байта в памяти ('m1 == m2') и аналогичным образом: открытие файла, его закрытие снова и открытие другого будет повторно использовать дескриптор файла ('h1 == h2'). – CherryDT

+1

Ах, не заметил вызова 'func1' в середине. Я думаю, что LP - наполовину правы - я думаю, что речь идет не о взломе (потому что хакеры могут просто освободить свою память и закрыть свои файлы), но проверить, протекает ли 'func1' всякая куча памяти и/или какие-либо файлы. Думаю, 'func1' должен очистить свой материал и не оставлять ничего свисающего. ** ИЗМЕНИТЬ **: Я превращу это в ответ. – CherryDT

ответ

4

Как указано в моем комментарии, мне кажется, что это проверка, чтобы увидеть func1 подтекают ли память или файл ручки.

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

Если func1 вызовов malloc но забывает free памяти снова, или открывает файл и не закрывает его снова, значение m1 и m2 или h1 и h2, respecitively, будет отличаться.

Однако это не переносной подход. Он может работать на одной конкретной платформе, но нет никакой гарантии, что кучи и файлы будут повторно использоваться на других платформах - они могут возвращать разные значения до и после func1, даже если ничего не было пропущено.

+0

Хороший ответ. Он проясняет все. – LPs

Смежные вопросы