边界检查性病::在铛矢量(和其他容器)?(Bounds checking of std::vecto

2019-09-02 09:25发布

在铛,有一种方法,以使边界建设仅调试模式时检查[]访问的std ::向量和其它STL容器,优选?

我只花了几个小时追捕一个微妙的错误,竟然是由美国访问过去一个std ::向量的末尾引起的。 它并不需要做任何事情聪明,当它检测到错误,只是陷阱在调试器,这样我可以找出它发生在代码修复它。

有没有办法做到这一点比其他“创建您自己的类型,从性病::向量继承”,我想避免?

(我使用铛3.1版,如果有差别。)

Answer 1:

如果你使用的是Linux或OS X,你应该看看地址消毒剂:

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

它引入了一个2倍放缓,但确实一堆内存检查,并可以赶上你的错误。

另一个惊人的工具,它为我节省了无数次的valgrind是。 如果你可以用Valgrind的运行它会赶上一吨的内存错误和泄漏。



Answer 2:

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

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

| 我的理解是,这项工作一直没有完成,它可能打破/不完整的。

那是正确的。 这是我的东西来修复/实行名单上,但它不是东西,我会得到很快。

它似乎对工作std::vector3.4和高达现场观看 ,给下面的程序:

#include <vector>
#include <iostream>

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

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

它生成以下错误:

矢量[]索引超出范围

中止



Answer 3:

#define _GLIBCXX_DEBUG

这使得各种内嵌检查(见矢量和调试/矢量)



文章来源: Bounds checking of std::vector (and other containers) in clang?