gpt4 book ai didi

c++ - 定义未定义的行为

转载 作者:IT老高 更新时间:2023-10-28 22:15:09 25 4
gpt4 key购买 nike

是否存在任何 C++(和/或 C)的实现,可以保证在任何时候调用未定义的行为,它都会发出错误信号?显然,这样的实现不如标准 C++ 实现高效,但它可能是一个有用的调试/测试工具。

如果不存在这样的实现,那么是否有任何实际原因导致无法实现?还是只是还没有人完成实现它的工作?

编辑:为了更准确一点:我希望有一个编译器允许我为 给定的运行做出断言 的 C++ 程序运行完成,该运行的任何部分都没有涉及未定义的行为。

最佳答案

是的,也不是。

我相当肯定,出于实际目的,实现可以使 C++ 成为一种安全的语言,这意味着每个操作都有明确定义的行为。当然,这会带来巨大的开销,并且在某些情况下它可能根本不可行,例如多线程代码中的竞争条件。

现在,问题是这不能保证您的代码是在其他实现中定义的!也就是说,它仍然可以调用 UB。例如,观察以下代码:

int a;
int* b;

int foo() {
a = 5;
b = &a;
return 0;
}

int bar() {
*b = a;
return 0;
}

int main() {
std::cout << foo() << bar() << std::endl;
}

根据标准,foobar 的调用顺序由实现决定。现在,在一个安全的实现中,必须定义这个顺序,可能是从左到右的评估。问题是评估从右到左调用 UB,直到您在不安全的实现上运行它才会被捕获。安全的实现可以简单地编译评估顺序的每个排列或进行一些静态分析,但这很快就会变得不可行并且可能无法确定。

总之,如果存在这样的实现,它会给你一种错误的安全感。

关于c++ - 定义未定义的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14073305/

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