Как я могу исправить утечки, созданные человеком 2 стат членов в с - PullRequest
0 голосов
/ 29 августа 2018

Я повторно выполняю команду unix ls, но когда я проверяю на утечки, он говорит: Процесс 44151: 248 узлов неправильно для 45 КБ, Процесс 44151: 28 утечек для 560 общих утечек байтов. поэтому я попытался освободить pwd и grp. но он говорит, что я освобождаю память, которая никогда не выделялась.

static int      one(const struct dirent *unused)
{
    (void)unused;
    return (1);
}

void            ls_l(void)
{
    struct stat     statbuf;
    struct group    *grp;
    struct passwd   *pwd;
    struct dirent   **sd;
    int             n;
    int             i;

    pwd = getpwuid((geteuid()));
    n = scandir(".", &sd, one, alphasort);
    i = 1;
    while (i < n)
    {
        while (strncmp(sd[i]->d_name, ".", 1) == 0)
            i++;
        if (stat(sd[i]->d_name, &statbuf) == 0)
        {
            ft_perm(sd[i]->d_name);
            ft_printf(" %-2d %4s  ", statbuf.st_nlink, pwd->pw_name);
            if ((grp = getgrgid(statbuf.st_gid)) != NULL)
                ft_printf(" %-8.8s %5d %s %s\n",grp->gr_name,
                        (int)statbuf.st_size,ft_group(ctime(&statbuf.st_mtime)),
                        sd[i]->d_name);
            else
                ft_printf(" %-8d %5d %s %s\n", statbuf.st_gid,
                        (int)statbuf.st_size,ft_group(ctime(&statbuf.st_mtime)),
                        sd[i]->d_name);
        }
        free(sd[i]);
        i++;
    }
    free(sd);
}

1 Ответ

0 голосов
/ 29 августа 2018
while (strncmp(sd[i]->d_name, ".", 1) == 0)
            i++;
// code
free(sd[i]);

Есть причина утечки памяти. Вы никогда не освобождаете элементы sd, имена файлов которых начинаются с точки.

Кроме того, я бы использовал sd[i]->d_name[0] == '.' для этого сравнения. strncmp() излишне для этого. Исправлена ​​версия вашего цикла:

for (int i = 0; i < n; i += 1) {
   while (i < n && sd[i]->d_name[0] == '.') {
       free(sd[i++]);
   }
   if (i == n) {
      break;
   }

    // code

    free(sd[i]);
}
free(sd);

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

...