遍历文件系统时内存损坏
Memory corruption when traversing a file system
我正在制作一个横跨系统所有子文件的函数,如果它是一个常规文件,则打印出文件目录。如果它在目录中,它将打印出一个文件,但是一旦它试图遍历一个子目录,它就会给我一个 malloc() memory corruption error
,尽管我没有分配任何东西。
void Traverse(char* dir)
{
struct stat buffer;
struct stat *s=&buffer;
struct dirent* file;
DIR* currentDir;
// printf("%s \n",dir);
if((strstr(dir,"./")!=NULL)||(strstr(dir,"../")!=NULL))
return;
currentDir = opendir(dir);
if (lstat(dir,s)==0)
{
if(S_ISREG(s->st_mode))
printf("%s \n", dir);
else if (S_ISDIR (s->st_mode))
{
while((file= readdir(currentDir))!=NULL)
{
char* path = strdup(dir);
strcat(path,"/");
strcat(path,file->d_name);
Traverse(path);
}
closedir(currentDir);
}
}
else
return;
}
问题是您正在使用 strcat
进入 strdup
-ed 内存(与 malloc
-ed 内存相同),而没有分配足够的 space 作为后缀。
要解决此问题,您需要使用 malloc
+strcpy
(或其他一些形成字符串的方式,例如 sprintf
)而不是 strcat
,并确保为字符串分配额外的 space。另外需要调用free
来避免内存泄露:
size_t len = strlen(dir)+strlen(file->d_name)+2; // 1 for '/' + 1 for '[=10=]' => 2
char* path = malloc(len);
// Check the result of malloc here
sprintf(path, "%s/%s", dir, file->d_name);
Traverse(path);
free(path); // Avoid memory leaks
我正在制作一个横跨系统所有子文件的函数,如果它是一个常规文件,则打印出文件目录。如果它在目录中,它将打印出一个文件,但是一旦它试图遍历一个子目录,它就会给我一个 malloc() memory corruption error
,尽管我没有分配任何东西。
void Traverse(char* dir)
{
struct stat buffer;
struct stat *s=&buffer;
struct dirent* file;
DIR* currentDir;
// printf("%s \n",dir);
if((strstr(dir,"./")!=NULL)||(strstr(dir,"../")!=NULL))
return;
currentDir = opendir(dir);
if (lstat(dir,s)==0)
{
if(S_ISREG(s->st_mode))
printf("%s \n", dir);
else if (S_ISDIR (s->st_mode))
{
while((file= readdir(currentDir))!=NULL)
{
char* path = strdup(dir);
strcat(path,"/");
strcat(path,file->d_name);
Traverse(path);
}
closedir(currentDir);
}
}
else
return;
}
问题是您正在使用 strcat
进入 strdup
-ed 内存(与 malloc
-ed 内存相同),而没有分配足够的 space 作为后缀。
要解决此问题,您需要使用 malloc
+strcpy
(或其他一些形成字符串的方式,例如 sprintf
)而不是 strcat
,并确保为字符串分配额外的 space。另外需要调用free
来避免内存泄露:
size_t len = strlen(dir)+strlen(file->d_name)+2; // 1 for '/' + 1 for '[=10=]' => 2
char* path = malloc(len);
// Check the result of malloc here
sprintf(path, "%s/%s", dir, file->d_name);
Traverse(path);
free(path); // Avoid memory leaks