c++ - 了解 DCL60-CPP 中的不合规代码示例:遵守单一定义规则
问题描述
我正在寻找一些安全的编码指南,并遇到了 SEI CERT C++ 编码标准。
到目前为止,大多数事情都很清楚,但我不明白DCL60-CPP 的最后一个不合规代码示例:遵守单一定义规则。
在这个不兼容的代码示例中,常量对象n
具有内部链接,但在f()
具有外部链接的 内部使用 odr。因为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 可能会一直工作 - 直到您打开改进的链接时间优化,那时它可能会在您的脑海中崩溃。
推荐阅读
- mysql - 运行查询时没有结果(空白) - 试图从 3 个表中得到结果
- c - 无法在一对 unix 套接字客户端服务器之间交换消息以随机交换消息
- c# - 如何在本地存储应用程序数据,以便信息可以跨应用程序会话持续存在
- excel - 如何在 VBA 中使用循环创建无限数量的图表
- python - 如何在scrapy规则中使用meta
- c# - 单击gridview c#外部时取消编辑
- jquery - 如何获取文本数据
一些文字
- java - 使用来自 maven 的内联 jar 文件构建 osgi 包
- java - JRCsvExporter、JRCsvExporterParameter 已弃用和新替换示例
- java - 将行导出到 Excel 时如何替换默认的 jtable 列值 - Java