0
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 shell 的代码片段。但是上面的代码在我输入时有问题

$ cd ~/代码

它按预期执行,但在以下情况下,它显示“不是有效路径”。我无法弄清楚为什么。

$ cd ~/code/[name_of_some_valid_directory]

4

2 回答 2

3

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>到代码的头部以使用mallocfree.

于 2015-10-01T14:59:26.697 回答
2

此处分配的值

argv[1] = path;

在这里不再有效

if(chdir(argv[1])<0) {

由于定义的作用域({...}path是有效的已经离开,所以argv[1]指向无效的内存。

然后调用chdir()访问这个无效的内存,这反过来又引发了臭名昭著的未定义行为,从那时起任何事情都可能发生。

于 2015-10-01T15:01:50.023 回答