int cmd_cd(char* argv[]) {
if(argv[1] == NULL || strncmp("~", argv[1], 1) == 0){
struct passwd *pw = getpwuid(getuid());
if(argv[1] == NULL || strlen(argv[1]) == 1){
argv[1] = pw->pw_dir;
}
else{
char path[strlen(pw->pw_dir) + strlen(arg[1])];
strcpy(path, pw->pw_dir);
argv[1] = &argv[1][1];
strcat(path, argv[1]);
argv[1] = path;
}
}
if(chdir(argv[1])<0) {
printf("Not a valid path\n");
return -1;
}
return 0;
}上面是一个代码片段,我试图在其中制作一个玩具linux外壳。但是上面的代码是错误的,就像我键入
$ cd ~/代码
它按预期执行,但在下面的情况下,它表示“不是一个有效的路径”。我不知道为什么。
$ cd ~/code/name_of_some_目录
发布于 2015-10-01 14:59:26
path在退出定义的块时被删除。
试试这个:
int cmd_cd(char* argv[]) {
char *path = NULL;
if(argv[1] == NULL || strncmp("~", argv[1], 1) == 0){
struct passwd *pw = getpwuid(getuid());
if(argv[1] == NULL || strlen(argv[1]) == 1){
argv[1] = pw->pw_dir;
}
else{
path = malloc(strlen(pw->pw_dir) + strlen(arg[1]));
if (path == NULL){
printf("Memory allocation failed\n");
return -1;
}
strcpy(path, pw->pw_dir);
argv[1] = &argv[1][1];
strcat(path, argv[1]);
argv[1] = path;
}
}
if(chdir(argv[1])<0) {
printf("Not a valid path\n");
if (path != NULL) free(path);
return -1;
}
if (path != NULL) free(path);
return 0;
}如果需要使用#include <stdlib.h>和free,请将malloc添加到代码头。
发布于 2015-10-01 15:01:50
在此分配的值
argv[1] = path;在这里不再有效了
if(chdir(argv[1])<0) {由于定义了{...}的作用域( path )是有效的,所以argv[1]指向无效内存。
然后,对chdir()的调用访问这个无效的内存,这反过来又会引发臭名昭著的未定义行为,从那时起,任何事情都可能发生。
https://stackoverflow.com/questions/32890567
复制相似问题