8

在铿锵声中,有没有办法启用边界检查 [] 访问 std::vectors 和其他 STL 容器,最好是仅在调试模式下构建?

我只是花了几个小时寻找一个微妙的错误,结果证明它是由我们访问超过 std::vector 的末尾引起的。当它检测到错误时,它不需要做任何聪明的事情,只需在调试器中捕获,这样我就可以找出它发生的位置并在代码中修复它。

除了“创建自己的继承自 std::vector 的类型”之外,还有其他方法吗?我想避免这种情况?

(如果有什么不同,我正在使用 clang 3.1 版。)

4

3 回答 3

4

libstdc++具有成熟的调试模式,使用-D_GLIBCXX_DEBUG.

libc++也有一个调试模式-D_LIBCPP_DEBUG但我们可以看到这个邮件列表讨论:libc++调试模式的状态它是不完整的:

| 我的理解是,这项工作从未完成,它可能已损坏/不完整。

那是对的。它在我要修复/实施的事情清单上,但这不是我很快就会做到的事情。

它似乎确实适用于std::vectoron 3.4and up see it live,请给出以下程序:

#include <vector>
#include <iostream>

int main()
{
    std::vector<int> v = {0,1,2,3} ;

    std::cout << v[-1] << std::endl ;
}

它会产生以下错误:

向量[] 索引超出范围

中止

于 2015-05-05T20:41:09.547 回答
3

如果您使用的是 Linux 或 OS X,您应该查看地址清理程序:

http://clang.llvm.org/docs/AddressSanitizer.html

它引入了 2 倍的减速,但会进行大量内存检查,并且可能会发现您的错误。

另一个救了我无数次的神奇工具是 valgrind。如果您可以使用 valgrind 运行,它将捕获大量内存错误和泄漏。

于 2013-08-13T16:14:55.317 回答
2
#define _GLIBCXX_DEBUG

这启用了各种内联检查(请参阅向量和调试/向量)

于 2013-05-09T17:58:58.150 回答