【发布时间】:2021-03-26 11:43:52
【问题描述】:
C++ 中未定义的行为很难调试。是否存在不包含任何未定义行为而是抛出异常的 C++ 和标准库版本?我知道这会成为性能杀手,但我只打算在调试模式下编程、调试和编译时使用这个版本,并不真正关心性能。理想情况下,此版本是可移植的,您可以轻松打开/关闭未定义的行为检查。
例如,您可以像这样实现一个安全指针类(仅检查空指针,而不是实际上是否指向有效的内存块):
template <typename T>
class MySafePointer {
T* value;
public:
auto operator-> () {
#ifndef DEBUG_MODE
assert(value && "Trying to dereference a null pointer");
#endif
return value;
}
/* Other Stuff*/
};
如果你想恢复你的表现,用户只需要#undef DEBUG_MODE。
是否有执行此操作的 C++ 库/安全版本?
编辑:更改了上面的代码,使其实际上更有意义并且不会引发异常,但断言值是非空的。这个问题只是一个描述性错误消息与崩溃的问题......
【问题讨论】:
-
有编译器插件,比如
-fsanitize=undefined。但是一些未定义的行为只是不可能检测到。 -
常量表达式中的程序,UB 是不允许的。 (还有一些合法的运行时构造)。
-
@SomeProgrammer: Halting problem 例如。 (没有可观察行为的无限循环是 UB)。
-
@Jarod42:但显然实现可以选择将无限循环实现为无限循环。
-
根据您在安全方面需要走多远,最好的选择是更改语言。想到 C# 和 rust