【问题标题】:Handling null pointers on AIX with GCC C使用 GCC C 在 AIX 上处理空指针
【发布时间】:2012-02-17 21:43:14
【问题描述】:

我们有一段用 C 编写的代码,有时不能很好地处理零指针。

代码最初是在 Solaris 上编写的,这样的指针会导致分段错误。不理想,但比继续耕作要好。

我们的经验是,如果您在 AIX 上读取空指针,您将得到 0。如果您使用 xlc 编译器,您可以添加一个选项 -qcheck=all 来捕获这些指针。但我们使用 gcc(并希望继续使用该编译器)。 gcc 是否提供这样的选项?

【问题讨论】:

  • “不能很好地处理零指针”是什么意思?
  • 我个人认为所有对 NULL 的引用(技术上是 0)都是错误,并且会添加代码来检查它,而不是相信编译器会为我做这件事。特别是因为编译器不知道如果有 NULL 指针我想做什么?有时可以跳过访问指针的代码,有时这是需要中止程序的致命错误。
  • AFAIK 取消引用 NULL 指针会导致未定义的行为。
  • 您需要修复您的代码,不要再假装问题可以通过其他方式解决。不要取消引用空指针。故事结束。
  • 为什么这么多回复责骂 OP 修复他的代码?我读到的问题是询问是否可以说服编译器帮助检测错误,而不是要求编译器“修复”或隐藏问题(陷阱并不能完全隐藏问题)。

标签: c gcc aix


【解决方案1】:

gcc 是否提供这样的选项?

我不好意思地自愿回答不,它没有。虽然我不能引用关于 gcc 和运行时 NULL 检查的信息不存在

您要解决的问题是,您试图在编写不佳的程序中使未定义的行为更加明确。

我建议您硬着头皮切换到 xlc 或手动将 NULL 检查添加到代码中,直到发现并删除不良行为。

考虑:

  • 制作一个宏来对指针进行空值检查
  • 在指针赋值后添加该宏
  • 将该宏添加到接受指针的函数的入口点

随着错误被删除,您可以开始删除这些检查。

【讨论】:

    【解决方案2】:
    1. 请帮我们大家一个忙,并在您的代码中添加正确的NULL 检查。通过仅在需要时检查 NULL 而不是让编译器在所有地方执行检查,您不仅可以略微提高性能,而且您的代码将更易于移植到其他平台。

      更不用说这样一个事实,即您更有可能打印正确的错误消息,而不是让编译器丢弃一些对您的用户毫无帮助的难以理解的堆栈转储/源代码位置/错误代码。

    2. AIX 使用 NULL 页面的概念。本质上,NULL(即虚拟地址0x0)被映射到包含一大堆零的位置。这允许字符串操作代码等。尽管遇到NULL 指针,仍继续。

      这与大多数其他类 Unix 系统相反,但它不违反 C 标准,该标准将取消引用 NULL 视为未定义的操作。不过,在我看来,这被严重破坏了:它需要一个会剧烈崩溃的应用程序,然后将其变成一个默默地忽略编程错误的应用程序,从而可能产生完全不正确的结果。

    3. 据我所知,GCC 无法解决根本性损坏的代码。即使是历史上支持的模式,例如可写字符串文字,也已在较新的 GCC 版本中慢慢淘汰。

      在使用诸如-fmudflap 之类的内存调试选项时可能会有一些支持,但我真的不知道 - 在任何情况下您都不应该在生产系统中使用调试代码,尤其是强制损坏的代码工作。

    底线:我认为你不能避免添加明确的NULL 检查。

    不幸的是,我们现在遇到了一个基本问题:应该在哪里添加 NULL 检查?。我认为让编译器不加选择地添加此类检查会有所帮助,前提是您在发现问题时添加显式检查。

    很遗憾,AIX 不支持 Valgrind。如果您有钱,您可能想看看 IBM Rational Purify Plus for AIX - 它可能会发现此类错误。

    也可以在测试系统上使用xlc,在其他所有系统上使用gcc,但遗憾的是它们并不完全兼容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-08
      • 2014-01-15
      • 2018-04-09
      相关资源
      最近更新 更多