C++中的大量操作会导致未定义的行为,其中规范完全静音程序的行为应该是什么,并允许任何事情发生.因此,有各种各样的情况,人们有代码在调试但不是发布模式编译,或者直到看似无关的更改,或者在一台机器而不是另一台机器上工作,等等.
我的问题是是否有一个实用程序查看C++代码的执行并标记程序调用未定义行为的所有实例.虽然我们有很好的工具,比如valgrind和检查过的STL实现,但这些并不像我想的那么强 - 例如,如果你丢弃了你仍然分配的内存,那么valgrind会有误报,并且检查了STL实现不会通过基类指针捕获删除.
这个工具存在吗?或者让它躺在身边甚至是有用的?
编辑:我知道一般来说静态检查C++程序是否可能执行具有未定义行为的东西是不可判定的.但是,可以确定C++ 的特定执行是否产生了未定义的行为.实现此目的的一种方法是创建一个C++解释器,根据规范中列出的定义逐步执行代码,在每个点确定代码是否具有未定义的行为.这不会检测特定程序执行中未发生的未定义行为,但会发现任何实际在程序中显示的未定义行为.这与图灵识别如何确定TM是否接受某些输入有关,即使它通常仍然是不可判定的.
谢谢!
我正在研究核心常量表达式*中允许的内容,这在C++标准草案的5.19 常量表达式第2段中有所描述:
条件表达式是核心常量表达式,除非它涉及以下之一作为潜在评估的子表达式(3.2),但是未评估的逻辑AND(5.14),逻辑OR(5.15)和条件(5.16)操作的子表达式不考虑[注意:重载的运算符调用函数.-end note]:
并列出随后的子弹中的排除项并包括(强调我的):
- 具有未定义行为的操作 [注意:包括,例如,有符号整数溢出(第5条),某些指针算术(5.7),除零(5.6)或某些移位操作(5.8) - 结束注释];
嗯?为什么常量表达式需要此子句来涵盖未定义的行为?常量表达式是否有一些特殊的东西需要未定义的行为才能在排除中进行特殊划分?
拥有这个条款是否给了我们没有它的任何优势或工具?
作为参考,这看起来像广义常量表达式提案的最新修订版.
如果程序根据C++ 11标准以不可预测的方式运行,是否有任何命令行选项或技术使GCC编译器报告错误?
经过一些资源修改(图像),我的程序一直在随机崩溃(0xC0000005).我知道这些来自糟糕的内存管理,但我无法找到它来自哪里,原因有两个:第一,我没有手动使用很多指针或动态分配变量(我的意思是我使用的标准库它对我而言,第二,当我使用gdb进行调试时,错误不会发生(但是在运行调试版本时出现,没有gdb).
我试图找出错误sd::cout,但由于我的程序编写方式,我仍然找不到它.我加倍,三重检查我使用的指针和动态数组,仍然无法找到它.有关信息,调试编译"-g -std=c++14",但没有"-O2".我使用Code::Block64位MingW和GCC 5.1.0以及gdb 7.9.
所以,我读了很多类型的bug(0xC0000005)和Heisenbug,但我不知道如何处理它,我不知道现在该尝试什么.
我会告诉你代码,但它分布在30个文件中.如果你真的想看到的,它在这里 GitHub上虽然.
此外,您将无法测试它,因为我没有上传资源文件(我不拥有它们).
那么你有什么建议让我能够找到bug的来源吗?