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 )会出现段错误。我相信对可能发生的事情的经典描述是鼻恶魔可能会飞出你的鼻子,但不确定行为是未定义还是未指定。我从不认为这是一个非常重要的区别:只是不要这样做。

于 2013-02-04T03:35:20.263 回答