了解 DCL60-CPP 中的不合规代码示例:遵守单一定义规则



我正在寻找一些安全的编码指南,并遇到了SEI CERT C++编码标准。

到目前为止,大多数事情都很清楚,但我不明白 DCL60-CPP 的最后一个不合规代码示例:遵守一个定义规则。

在这个不合规的代码示例中,常量对象n具有内部链接,但在具有外部链接的f()中使用。由于f()声明为内联函数,因此f()的定义在所有翻译单元中必须相同。但是,每个翻译单元都有一个唯一的n实例,导致违反ODR。

const int n = 42;
int g(const int &lhs, const int &rhs);
inline int f(int k) {
return g(k, n);
}

我尝试将显示的代码放在头文件中,并将其包含在两个单独的 cpp 文件中。然后我用 clang++ 和 g++ 编译了它。两者都没有警告。它正常执行。

编辑:所以我不明白的是所示示例如何或在什么情况下违反 ODR。

确实违反了 ODR。 违反ODR是"未定义的行为"。

未定义行为的一种更常见形式是"完全按照程序员的期望行事"。 然而,根据我的经验,一种更常见的形式是"几乎一直做程序员期望的事情,但偶尔会随机崩溃"。

这个特定的UB可能总是有效的 - 直到你打开改进的链接时间优化,当它可能会在你的头上崩溃

最新更新