Ошибка сегментирования при попытке выполнить программу

При решении задачи

Для заданного каталога (аргумент 1 командной строки) и всех его подкаталогов вывести в заданный файл (аргумент 2 командной строки) и на консоль имена файлов, их размер и дату создания, удовлетворяющих заданным условиям: 1 – размер файла находится в заданных пределах от N1 до N2 (N1,N2 задаются в аргументах командной строки), 2 – дата создания находится в заданных пределах от M1 до M2 (M1,M2 задаются в аргументах командной строки).

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <string.h>
#include <stdlib.h>

int searchdir(char *name);

int maxsize=0;
int minsize=0;
long mindate=0;
long maxdate=0;


FILE *f1;

int main(int argc, char *argv[])
{
 maxsize=atoi(argv[4]);
 minsize=atoi(argv[3]);
 maxdate=atol(argv[6]);
 mindate=atol(argv[5]);
 f1=fopen(argv[2],"w");
 
 searchdir(argv[1]);
 
 fclose(f1);
 return 0;
}

int searchdir(char *name)
{
 char dirname[256];
 char newname[256];
 DIR *d1;
 struct dirent *d;
 struct stat st1;
 
 d1=opendir(name);
 d=readdir(d1);
 
 strcpy(dirname,name);
 strcat(dirname,"/");
 
 while (d!=NULL)
 {
   if (d->d_type == DT_DIR)
   {
     if ((strcmp(d->d_name,".")!=0)&&(strcmp(d->d_name,"..")!=0))
     {
      strcpy(newname,dirname);
      strcat(newname,d->d_name);
     
      searchdir(newname);
     }
   }
   d=readdir(d1);
 }
 
rewinddir(d1);
 while ((d=readdir(d1))!=0)
 {
   if (d->d_type==DT_REG)
   {
     strcpy(newname, dirname);
     strcat(newname,d->d_name);
     
     stat(newname,&st1);
     if (((st1.st_size)>=minsize)&&((st1.st_size)<=maxsize))
     {
       if (((st1.st_mtime)>=mindate)&&((st1.st_mtime)<=maxdate))
       {
     fprintf(f1,"%s  %d  %d\n",newname,st1.st_size,st1.st_mtime);
     printf("%s  %d  %d\n",newname,st1.st_size,st1.st_mtime);
       }
     }
   }
   d=readdir(d1);
 }
 closedir(d1);
}

Компиляция происходит успешно, однако при попытке выполнения

./app.exe ./bin out.txt 0 100 1000000000 1300000000

Столкнулся с ошибкой Ошибка сегментирования (стек памяти сброшен на диск) В чем может быть проблема?


Ответы (1 шт):

Автор решения: KoVadim

Падает из за того, что вызов d1=opendir(name); в 41 строке может вернуть NULL и последующий readdir не очень хочет работать с нулем (NULL). Элементарная проверка вида if (d1 == NULL) return 1; сразу делает приложение рабочим.

→ Ссылка