我有几个配置标志,我实现为结构。我创建了一个对象。我用一个标志调用一个对象的方法,最终触发两个标志之间的比较。但是,此时,其中一个标志已被某种方式覆盖。
为了澄清,这里有一个非常简化的代码版本,应该说明我所看到的内容:
class flag_type { unsigned int flag; /*more stuff*/ };
flag_type FLAG1
flag_type FLAG2
class MyObject {
public:
void method1(const flag_type& flag_arg) {
//conditionals, and then:
const flag_type flag_args[2] = {flag_arg,flag_arg};
method2(flag_args);
}
void method2(const flag_type flag_args[2]) {
//conditionals, and then:
method3(flag_args[0]);
}
void method3(const flag_type& flag_arg) { //Actually in a superclass
//stuff
if (flag_arg==FLAG1) { /*stuff*/ }
//stuff
}
};
int main(int argc, const char* argv[]) {
//In some functions called by main:
MyObject* obj = new MyObject();
//Later in some other functions:
obj->method1(FLAG1);
}
使用调试器和打印语句,我可以确认“method1”和“method2”中的FLAG1和flag_arg / flag_args都正常。但是,当我到达method3时,“FLAG1.flag”已被破坏,因此比较失败。
现在,虽然我通常不会这样做,并且它在最严格的设置上通过了MSVC的静态代码分析,但这对我来说看起来像是缓冲区溢出的行为。
我没有通过观察找到任何这样的错误,但当然通常没有。我的问题是答:我是否在其他地方搞砸了?我意识到我没有分享任何真正的代码,但我已经错过了什么?在我重写了大部分代码之前,这个方案才有用 B:在找到代码之前,是否有更简单的方法而不是仔细检查代码?代码是跨平台的,所以我已经将它设置为在Ubuntu盒子上检查Valgrind。
答案 0 :(得分:0)
感谢那些试图提供帮助的人。但是,应该注意的是,代码仅用于说明目的;我从头开始打字显示一般情况正在发生;不要编译。回想起来,我发现要求人们用如此少的信息来解决这个问题是不公平的 - 尽管我的实际问题是“有更简单的方法而不是更仔细地检查代码”并不真正关心实际解决问题 - - 如何接近它。
至于这个问题,在Ubuntu Linux上,我得到了“堆栈粉碎”,它或多或少地告诉我问题发生的地方。有趣的是,堆栈粉碎的追溯是最有帮助的。长话短说,这是一个令人尴尬的基本错误; strcpy溢出(在〜,|和&运算符中,标志有这样设置的调试字符串)。至少它不是 me 编写该代码的人。总是使用strncpy,人:P