Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
clang中std::vector(和其他容器)的边界检查?_Clang_Stdvector - Fatal编程技术网

clang中std::vector(和其他容器)的边界检查?

clang中std::vector(和其他容器)的边界检查?,clang,stdvector,Clang,Stdvector,在clang中,是否有一种方法可以启用边界检查[]对std::vectors和其他STL容器的访问,最好是在仅以调试模式构建时 我只是花了几个小时寻找一个微妙的bug,结果是由于我们访问了std::vector的末尾。当它检测到错误时,不需要做任何聪明的事情,只需在调试器中设置陷阱,这样我就可以找到错误发生的地方并在代码中修复它 除了“创建从std::vector继承的您自己的类型”之外,还有其他方法可以做到这一点吗 (如果有区别的话,我使用的是clang 3.1版。) 这将启用所有类型的内联检

在clang中,是否有一种方法可以启用边界检查[]对std::vectors和其他STL容器的访问,最好是在仅以调试模式构建时

我只是花了几个小时寻找一个微妙的bug,结果是由于我们访问了std::vector的末尾。当它检测到错误时,不需要做任何聪明的事情,只需在调试器中设置陷阱,这样我就可以找到错误发生的地方并在代码中修复它

除了“创建从std::vector继承的您自己的类型”之外,还有其他方法可以做到这一点吗

(如果有区别的话,我使用的是clang 3.1版。)


这将启用所有类型的内联检查(请参阅vector和debug/vector)

如果您使用的是Linux或OS X,则应查看地址消毒剂:

它引入了2倍的减速,但会进行大量内存检查,可能会捕获您的错误


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

libstdc++
具有成熟的使用
-D\u GLIBCXX\u DEBUG

libc++
还有一个using
-D_LIBCPP_DEBUG
,但是我们可以看到这个邮件列表不完整:

|我的理解是,这项工作从来没有完成过,而且还没有完成 可能坏了/不完整

这是正确的。 这在我要修复/实现的事情清单上,但我不会马上去做

对于
3.4
及以上版本,它似乎确实适用于
std::vector
,请给出以下程序:

#include <vector>
#include <iostream>

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

    std::cout << v[-1] << std::endl ;
}
#包括
#包括
int main()
{
向量v={0,1,2,3};

std::cout在与libc++一起使用时,或者仅与libstdc++一起使用时,可以完成这项工作?我目前使用libc++是因为当我使用libstdc++编译时,它显然不可用……我不确定;我是通过读取Cygwin;a中的标题得出这一结论的。不过,这很容易检查——编写一个具有已知长度向量的简单程序,然后看看当您阅读过去。可以在gcc 4.5.3上找到它,但我在3.4.4上看不到它
\u GLIBCXX\u DEBUG
在libstdc++中工作,而不是在libc++中。在libc++上,我相信你可以使用
\u LIBCPP\u DEBUG2
。为不同级别的调试存储该值的0或1。是的,使用
at()
而不是
操作符[]
。这是为您提供运行时边界检查而定义的。我建议不要使用at()。虽然它会引发异常,但这并没有多大帮助,因为通常不会对矢量代码执行严格的异常检查。超出范围的错误通常是错误,因此不应使用异常跟踪它们,而应使用调试帮助程序和断言。请注意,AddressSanitizer不会捕获所有逻辑错误。例如,如果
std::vector vec;vec.reserve(10);
然后访问
vec[5]
是一个错误,但ASan不会检测到,因为它位于分配的内存中。请参阅我猜存档已移动:-p
#include <vector>
#include <iostream>

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

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