gpt4 book ai didi

c++ - 仅使用(稳定的)第三方库可以使我的代码无法正常工作

转载 作者:行者123 更新时间:2023-11-28 05:58:06 25 4
gpt4 key购买 nike

假设我有一个 C++ 项目,它已经运行多年。还说这个项目可能(需要验证)包含未定义的行为。所以也许编译器对我们很好,即使有 UB 也不会使程序行为异常。现在假设我想为项目添加一些功能。例如向其中添加 Crypto++ 库。但是我添加到它的实际代码说来自 Crypto++ 是合法的。 Here我阅读:

Your code, if part of a larger project, could conditionally call some 3rd party code (say, a shell extension that previews an image type in a file open dialog) that changes the state of some flags (floating point precision, locale, integer overflow flags, division by zero behavior, etc). Your code, which worked fine before, now exhibits completely different behavior.

但我无法准确判断作者的意思。他是否说即使将 say Crypto++ 库添加到我的项目中,尽管我添加的 Crypto++ 代码是合法的,我的项目也会突然开始不正确地工作?

这现实吗?任何可以证实这一点的链接?

我很难向相关人员解释只是添加库可能会增加风险。也许有人可以帮助我制定如何解释这一点?

最佳答案

当源代码调用未定义的行为时,这意味着标准不保证会发生什么。它可以在一次编译运行中完美运行,但是简单地使用更新版本的编译器或库再次编译它可能会使它崩溃。或者更改编译器的优化级别也可以产生相同的效果。

一个常见的例子是读取数组末尾的一个元素。假设您希望它为空,并且偶然下一个内存位置在正常情况下包含 0(假设它是一个错误标志)。它会毫无问题地工作。但是现在假设在更改了一些完全不相关的内容后的另一次编译运行中,内存组织发生了轻微的变化,数组之后的下一个内存位置不再是那个标志(保持恒定值),而是一个采用其他值的变量。您的程序将中断并且难以调试,因为如果将该变量用作指针,您可能会在随机位置覆盖内存。

TL/DR:如果一个版本有效但您怀疑其中有 UB,唯一正确的方法是在任何更改之前始终从代码中删除所有可能的 UB。或者,您可以保持工作版本不变,但请注意,您以后可能必须更改它...

关于c++ - 仅使用(稳定的)第三方库可以使我的代码无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33797726/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com