C++ 用于处理c+中堆栈损坏的工具+;

C++ 用于处理c+中堆栈损坏的工具+;,c++,stack,corruption,C++,Stack,Corruption,编辑:由于对我的示例的评论是正确的,我将其删除,并将其转化为一般性问题: 在我的项目中,有时我会遇到堆栈损坏。无论我多么努力地编写代码来避免它,有时它只是不可避免的。但是当它发生的时候,有什么方法来对抗它呢 我在这篇博客中找到了一个好人给出的宏:它读取ebp寄存器值以检测损坏 但是肯定会有更复杂的工具来帮助你避免枪击自己的脚。我在Windows中使用代码块和gcc编译器编程。我提出这个问题的原因是为了找到我可以在编程环境下使用的工具来帮助我发现并纠正这些错误。有什么建议吗 感谢您的回答,感谢您花

编辑:由于对我的示例的评论是正确的,我将其删除,并将其转化为一般性问题:

在我的项目中,有时我会遇到堆栈损坏。无论我多么努力地编写代码来避免它,有时它只是不可避免的。但是当它发生的时候,有什么方法来对抗它呢

我在这篇博客中找到了一个好人给出的宏:它读取ebp寄存器值以检测损坏

但是肯定会有更复杂的工具来帮助你避免枪击自己的脚。我在Windows中使用代码块和gcc编译器编程。我提出这个问题的原因是为了找到我可以在编程环境下使用的工具来帮助我发现并纠正这些错误。有什么建议吗


感谢您的回答,感谢您花时间阅读我的问题。

您是否存在堆栈损坏,这一点并不清楚。但我承认存在一些数据损坏

一种合理有效的技术是在可疑区域周围添加保护区域:

让构造函数将它们初始化为任何形式,但在不知道损坏性质的情况下,非零似乎更令人满意

myclass::myclass() : namecheck1(0x12345678), namcheck2(0x12345678) ...
添加一致性检查成员函数:

void myclass::isokay()
{
       if (namecheck1 != namecheck2  ||
           namecheck2 != 0x12345678)
             cerr << "the object is corrupted";
         ... // maybe wait for input, cause core dump, etc.
}
void myclass::isokay()
{
如果(namecheck1!=namecheck2||
名称检查2!=0x12345678)

cerrValgrind发现了各种各样的内存损坏


GCC有mudflap(
-fmudflap
和朋友)和
-fstack-protector
来捕获内存访问问题。其他编译器可能也会这样做。

1.没有发布实际的代码。2.您如何知道存在堆栈损坏?3.您为什么认为问题出在您指出的地方?4.您可以发布
艺术家
类的成员和构造函数的内容吗?我知道我会重新措辞这个问题。我不应该发布这个例子。这不是我项目中的实际腐败例子,只是我过去必须处理的一个腐败例子,这让我非常紧张。我会把这个问题变成一个关于堆栈腐败和处理它的工具的一般问题。有时这是不可避免的这只是胡说八道。避免堆栈损坏的最佳工具是良好的技术和遵守最佳实践。你实际上是对的,Martin。我同意你的观点。最好的工具是使用良好的技术。尽管如此,我还是发了这篇文章,想看看是否有任何方法可以让你有时摆脱绑定。建议:不要使用
0x12345678
更标准的
0xBAADF00D
:)我没意识到有一个标准的任意模式!:-)@wallyk:这不是真正的任意模式…“坏食物”是用来标记十六进制数据的。:]@Fred:哈哈,我以前没见过,很好!!还有更多:谢谢你们的评论和建议。这是一个标准模式,对吧?这就是为什么有时候在调试可疑部件时我看到0xBAADF00D。我认为这是巧合。我只知道0xDEADBEEF:)
void myclass::isokay()
{
       if (namecheck1 != namecheck2  ||
           namecheck2 != 0x12345678)
             cerr << "the object is corrupted";
         ... // maybe wait for input, cause core dump, etc.
}