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