3

これが私の比較的単純なシナリオです。条件付きを保存して、コードを少し整理できるかどうか疑問に思っています。他の誰かが書いた製品コードで、私は片付け中です。fclose がまったくなかったので、条件付きの fclose() 行を追加しただけです。

  FILE *fp;
  struct stat sb;
  /* snipped code */
  if (((fp = fopen (config_file, "r+")) == NULL) || (fstat (fileno (fp), &sb))) {
      syslog (LOG_ERR, "Fault. Unable to read config file");
      if (fp != NULL) {
          fclose (fp);
      }
      return -1;
  }
  /* code carries on after this */

if(fp != null)問題は、コードに を含める必要があるかどうかです。fclose(fp)チェックせずに実行することの意味は何ですか? 私は C89 標準を読みましたが、結果がどうなるかはわかりませんでした。

事前に乾杯

スティーブ

4

2 に答える 2

4

fcloseヌル ポインターの動作は未定義です。これは、セグメンテーション違反や問題の原因となる可能性があることを意味します。チェックは良い習慣であり、コードを読みやすくするため、チェックに固執します。

于 2013-02-04T03:35:32.673 に答える
1

BSD では、fclose( NULL )segfault が発生します。何起こるかについての古典的な説明は、鼻の悪魔が鼻から飛び出すかもしれないということだと思いますが、その行動が定義されていないのか、特定されていないのかは不明です. 私はそれが非常に重要な違いだとは考えていません。

于 2013-02-04T03:35:20.263 に答える