我正在使用Visual Studio 2008.
我知道std :: vector已经使用at()函数进行边界检查,并且如果您尝试使用operator []错误地访问某些内容(超出范围),则会有未定义的行为.
我很好奇是否可以使用边界检查来编译我的程序.这样,operator []将使用at()函数,并在某些事物超出范围时抛出std :: out_of_range.
将在没有边界检查operator []的情况下编译释放模式,因此性能不会降低.
我开始考虑这个问题,因为我正在将使用Borland C++编写的应用程序迁移到Visual Studio,并且在我的代码的一小部分中将其迁移(i = 0,j = 1):
v[i][j]; //v is a std::vector<std::vector<int> >
Run Code Online (Sandbox Code Playgroud)
向量'v'的大小为[0] [1](因此向量的元素0只有一个元素).这是未定义的行为,我知道,但是Borland在这里返回0,VS正在崩溃.我喜欢崩溃比返回0更好,所以如果我可以通过抛出std :: out_of_range异常得到更多'崩溃',迁移将更快完成(因此它会暴露更多Borland隐藏的错误).
多年来我使用了两个很棒的工具BoundsChecker&Purify,但这些应用程序的开发人员让我失望,他们不再努力维护它们或开发它们.我们在两家公司都有公司账户,他们都告诉我他们无意生产支持64位应用程序的版本.
任何人都可以推荐支持64位本机C++/MFC应用程序的开源或商业替代品吗?
在Delphi 2009中,我的程序现在生成"List index of bounds"错误.它会生成一个弹出框:
alt text http://www.beholdgenealogy.com/img/boundserror.gif
我正在使用"调试"构建配置,该配置已启用所有运行时错误检查.但这并没有在错误发生之前捕获错误.
是否有任何简单的方法可以在我的程序中找到此错误的来源,而无需通过反复试验来缩小断点并缩小范围?
我正在寻找Julia中边界检查规则的一些说明.这意味着如果我放在@inboundsfor循环的开头,
@inbounds for ... end
Run Code Online (Sandbox Code Playgroud)
然后只有"一层"的内部传播,所以如果内部有一个for循环,那么@inbounds不会关闭那里的边界检查吗?如果我使用@propagate_inbounds它,它将进入嵌套的for循环?
说@inbounds永远胜利是否正确@boundscheck?如果函数不是内联,但唯一的例外是,刚刚过去的"一层"的规则的情况下,因此@propagate_inbounds将关闭边界的非内联函数调用,即使检查?
我目前正在为Windows寻找一个良好的内存/泄漏检测工具.几年前,我使用了Numega的Boundschecker,这非常好.现在它似乎已被出售给Compuware,后者显然已将其再次出售给其他公司.
在最好的"企业"传统中,试图评估当前版本的演示到目前为止非常令人沮丧:
(a)其网站上没有广告价格(大红灯警告灯);
(b)要求提供雇主人数和其他私人信息的联系表格;
(c)没有回复我要求评估和价格的电子邮件.
我必须得出结论,BoundsChecker现在是"那些"产品之一.你知道吗,你天真地打电话的那种类型,明天穿着黑色西装的3个男人出现在你的建筑物里想要和你讨论"伙伴关系",而不是秘密地衡量你公司的规模,因此他们可以得到多少带你充电
那么,撇开,任何人都可以推荐一个优秀的内存检查/泄漏检测工具,它的成本是多少,并建议在哪里购买?
几个小时后,我正在摆弄一个内存泄漏问题,事实证明我真的有一些关于虚拟析构函数的基本内容错了!让我来解释一下我的班级设计.
class Base
{
virtual push_elements()
{}
};
class Derived:public Base
{
vector<int> x;
public:
void push_elements(){
for(int i=0;i <5;i++)
x.push_back(i);
}
};
void main()
{
Base* b = new Derived();
b->push_elements();
delete b;
}
Run Code Online (Sandbox Code Playgroud)
边界检查器工具报告派生类向量中的内存泄漏.我发现析构函数不是虚拟的,并且不会调用派生类析构函数.当我将析构函数虚拟化时,令人惊讶地得到了解决.即使未调用派生类析构函数,也不会自动释放向量吗?这是BoundsChecker工具中的怪癖还是我对虚拟析构函数的理解错误?
有没有办法检查VLA中的缓冲区溢出?我使用-fstack-protector-all -Wstack-protector但得到以下警告:
警告:不保护局部变量:可变长度缓冲区
有没有实现这个目标的图书馆?(-lefence用于堆内存)
我目前正在使用Valgrind和gdb.
考虑以下程序:
struct abc
{
int x[5];
int y[5];
};
int main()
{
struct abc test;
test.y[0] = 10;
printf("%d", test.x[5]);
}
Run Code Online (Sandbox Code Playgroud)
(借用来自结构的一个元素来查看另一个元素是否合法?)
BoundsChecker没有将此检测为溢出.是否有任何程序可以检测到这种类型的编程错误?
我想知道是否有一些额外内存区域的技术名称,这些区域分配用于调试目的并填充特殊模式,因此可以在运行时检查它们是否已被覆盖(从而检测到可能的缓冲区溢出) ...
一位老乡称他们为"Canarios"(西班牙语中的加那利群岛),我认为这是用于在矿井中用来检测沼气的金丝雀鸟的类比,但我不确定英文中是否使用相同的名称.
bounds-checker ×10
c++ ×5
c ×2
gcc ×2
arrays ×1
debugging ×1
delphi ×1
destructor ×1
julia ×1
memory ×1
memory-leaks ×1
mfc ×1
nomenclature ×1
profiling ×1
purify ×1
stl ×1
struct ×1
visual-c++ ×1