【问题标题】:Do GCC/Clang allow to access static member through null pointer?GCC/Clang 是否允许通过空指针访问静态成员?
【发布时间】:2014-11-19 08:46:42
【问题描述】:
#include <iostream>

struct Foo { static auto foo() -> int { return 123; } };

int main() {
    std::cout << static_cast<Foo*>(nullptr)->foo() << std::endl;
    return 0;
}

我知道这是标准不允许的。但是,具体的编译器呢?

我只关心 GCC(G++) 和 Clang。

是否可以保证这两个编译器允许将其作为编译器功能/规范/扩展?

【问题讨论】:

  • 这更像是一个“副作用”而不是功能。可能在调试模式下,可以检查访问结构成员的空指针。在 Release 中,这可能是很重的负载。
  • 您正在调用 static 函数,因此甚至没有使用空指针。如果它不是 static 函数,那么它仍然可以工作,因为不需要通过空指针来寻址任何内存。但是我相信这种行为仍然是不确定的。

标签: c++ gcc static clang null-pointer


【解决方案1】:

我在list of gcc's C++ extensionscorresponding list for clang. 中都找不到这个,所以我想说你不能保证这对任何一个编译器都有效。

【讨论】:

    【解决方案2】:

    没有什么说这会奏效。如果您决定使用它,则取决于您确定它确实适用于您使用它的实际架构。重要的是要反思这样一个事实,即代码生成、空指针使用的调试陷阱(等等)和所有编译器中的优化都是“依赖于目标系统的”——因此它可能在 x86 上运行良好,但在 MIPS 上却不行,例如.或者它可能会在编译器的 X+0.0.1 版本中以一种或另一种方式停止工作。

    话虽如此,我希望这个特定示例在任何架构上都能完美运行,因为this 不会在任何地方使用。

    请注意,仅仅因为某些东西未定义,并不一定意味着它会崩溃、失败甚至“不能完全按照您的预期工作”。但是,它确实允许编译器生成编译器想要的任何代码,包括炸毁您的计算机、格式化您的硬盘驱动器等的代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-13
      • 2015-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-12
      • 1970-01-01
      • 2011-03-16
      相关资源
      最近更新 更多