相关疑难解决方法(0)

一个检测未定义行为的C++实现?

C++中的大量操作会导致未定义的行为,其中规范完全静音程序的行为应该是什么,并允许任何事情发生.因此,有各种各样的情况,人们有代码在调试但不是发布模式编译,或者直到看似无关的更改,或者在一台机器而不是另一台机器上工作,等等.

我的问题是是否有一个实用程序查看C++代码的执行并标记程序调用未定义行为的所有实例.虽然我们有很好的工具,比如valgrind和检查过的STL实现,但这些并不像我想的那么强 - 例如,如果你丢弃了你仍然分配的内存,那么valgrind会有误报,并且检查了STL实现不会通过基类指针捕获删除.

这个工具存在吗?或者让它躺在身边甚至是有用的?

编辑:我知道一般来说静态检查C++程序是否可能执行具有未定义行为的东西是不可判定的.但是,可以确定C++ 的特定执行是否产生了未定义的行为.实现此目的的一种方法是创建一个C++解释器,根据规范中列出的定义逐步执行代码,在每个点确定代码是否具有未定义的行为.这不会检测特定程序执行中未发生的未定义行为,但会发现任何实际在程序中显示的未定义行为.这与图灵识别如何确定TM是否接受某些输入有关,即使它通常仍然是不可判定的.

谢谢!

c++ undefined-behavior

59
推荐指数
5
解决办法
6296
查看次数

指针是否保证在C++中的`delete`后保留其值?

灵感来自这个问题.

假设在C++代码中我有一个有效的指针并且正确delete.根据C++标准,指针将变为无效(3.7.3.2/4 - 解除分配函数将使所有指针无效,指向解除分配的存储的所有部分).

至少在大多数实现中,它保留了值并将存储与以前完全相同的地址delete,但是使用该值是未定义的行为.

标准是否保证指针将保留其值或允许更改的值?

c++ pointers delete-operator

16
推荐指数
2
解决办法
3198
查看次数

删除运算符在C++中应用后,地址会发生什么变化?

如果我delete指针如下,例如:

delete myPointer;
Run Code Online (Sandbox Code Playgroud)

而且,在这之后也没有分配0如下指针:

myPointer = 0; //skipped this
Run Code Online (Sandbox Code Playgroud)

myPointer指向另一个内存地址吗?

c++ pointers delete-operator

6
推荐指数
2
解决办法
2945
查看次数