1

ファイルを読み込もうとしている ac プログラムがあります。access()コマンドを使用すると、ファイルが存在すると表示されますが、 fopen()NULL が返され、errno はファイルが存在しないと表示されます。

コードの切り捨てられたスニペット:

  FILE *fp;
  char *filename = strdup(git_dir);
  strcat(filename, "/HEAD");

  printf(git_dir);
  printf(":");
  printf(filename);
  printf(":");

  if (access(filename, F_OK)) {
    printf("Y U NO OPEN:");
  }

  fp = fopen(filename, "r");
  if (fp == NULL) {
    printf(strerror(errno));
    return;
  }

コードからわかるように、これは git リポジトリの .git/HEADS ファイルを開こうとしています。これが失敗している特定のリポジトリは、別のリポジトリのサブディレクトリに複製され、サブモジュールとして追加されました。git submodule updateコマンドを実行して複製された問題はありません。

上記のコードは「YU NO OPEN:」を出力しませんが、strerror(). ファイル名を画面に出力してファイルを開いたところ、less正常に開きました。このプログラムは私のzshプロンプトを生成しているので、私のユーザーによって実行されていると思います.ファイルのパーミッションは

-rw-r--r-- 1 ben users   23 Jun 30 13:32 HEAD

助言がありますか?

4

1 に答える 1

6

あなたはこれを行うことはできません:

char *filename = strdup(git_dir);
strcat(filename, "/HEAD");

ファイル名に文字列「/HEAD」を追加していますが、ファイル名にはgit_dir. したがって、バッファを超えて書き込み、メモリを上書きし、大混乱を引き起こす可能性があり、あらゆる種類の予測不可能な動作が発生する可能性があります.

代わりにこれを行います:

char *filename = malloc(strlen(git_dir) + 6); //length of /HEAD + null terminator
strcpy(filename, git_dir);
strcat(filename, "/HEAD");

通常、stdout も行バッファリングされることに注意してください。これは、実行した場合printf("Y U NO OPEN:");、出力がすぐに表示されない可能性があることを意味します。出力をフラッシュするには、改行 \n を出力します。

于 2012-06-30T21:40:34.897 に答える