c++ - 是否有没有未定义行为的 C++ 安全版本?
问题描述
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++ 库/安全版本?
编辑:更改了上面的代码,使其实际上更有意义并且不会引发异常但断言值是非空的。这个问题只是一个描述性错误消息与崩溃的问题......
解决方案
是否存在不包含任何未定义行为而是抛出异常的 c++ 和标准库版本?
不,那里没有。正如评论中提到的,有 Address Sanitizer 和 Undefined Behavior Sanitizer 以及许多其他可用于寻找错误的工具,但没有“没有未定义行为的 C++”实现。
如果您想要一种本质上安全的语言,请选择一种。C++ 不是。
推荐阅读
- drop-down-menu - 如何在 Swift 4 和 iOS 11 中实现一个小的下拉菜单到 UIButton,例如选择一种货币?
- javascript - 使用动态输入删除操作符在 Javascript 中的项目
- typescript - 如何从 TypeScript 中的字符串数组创建类型?
- typescript - Animated.View 的样式道具的打字稿定义
- botframework - 如何在 Microsoft BOT 框架中检测和读取 facebook Emojis
- powershell - 通过 ssis 包运行时导入的 powershell 模块不可见
- r - 在 For 循环中的 R 中创建子集数据框
- amp-html - amp-next-page 是一种在用户缓存中预加载其他页面的方法吗?
- kubernetes - 如何使用一个代理在 Mesosphere DC/OS 上成功运行 Kubernetes?
- javascript - Javascript:日期 A 在日期 B 的 x 天内