【发布时间】:2015-11-19 07:35:16
【问题描述】:
假设我有 C++ 项目多年来一直运行良好。 还要说这个项目可能(需要验证)包含未定义的行为。 所以也许编译器对我们很友好,即使有 UB,也不会使程序行为不端。 现在想象一下我想为项目添加一些功能。例如向其中添加 Crypto ++ 库。 但是我从 Crypto++ 中添加的实际代码是合法的。 Here我看了:
如果您的代码是较大项目的一部分,则可以有条件地调用一些 第 3 方代码(例如,预览图像类型的 shell 扩展) 一个文件打开对话框)改变一些标志的状态(浮动 点精度、语言环境、整数溢出标志、除以零 行为等)。您的代码以前运行良好,现在显示 完全不同的行为。
但我无法准确判断作者的意思。他是否说即使在我的项目中添加说 Crypto ++ 库,尽管我添加的来自 Crypto++ 的代码是合法的,但我的项目可能突然开始无法正常工作?
这是现实的吗? 任何可以证实这一点的链接?
我很难向相关人员解释仅仅添加库可能会增加风险。也许有人可以帮助我制定如何解释这一点?
【问题讨论】:
-
您发布的链接中没有说明所有内容吗?如果你的代码中有 UB,它几乎可以在任何时候出于任何原因中断。
-
从技术上讲,添加库可以(并且很可能会)改变正在运行的应用程序的内存布局。动态内存可能分配在与以前不同的地址,并且代码可能映射到与以前不同的位置。假设您的写入超出了 100 个字节的范围 - 如果您在内存页面的开头执行此操作,则可能不会发生任何事情,但如果您在内存页面的末尾执行此操作,您可能会遇到分段错误。
-
只是告诉人们,由于糟糕的开发实践,代码有很多年未被发现的严重错误,但现在鸡终于回家了。
-
我不是在开玩笑。情况就是这样。你可以用更好的词来装扮它,但它就是这样。
-
@user200312 如果他们的代码包含 UB,那么即使没有添加这个新库,他们现在都处于危险之中。