2012-06-30 91 views
-2

我有几个配置标志,我正在实现作为结构。我创建一个对象。我用一个标志调用对象的方法,最终触发两个标志之间的比较。但是,到了这个时候,其中一个标志已被以某种方式覆盖。调用函数覆盖值

为了澄清,这里是代码的一个非常简化的版本,应该说明我所看到的:

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); 
} 

与调试器和打印报表,我可以证实,这两个FLAG1和flag_arg/flag_args都很好在“method1”和“method2”中。但是,当我到达method3时,“FLAG1.flag”已损坏,所以比较失败。

现在,虽然我通常对于不这样做很好,并且它在最严格的设置上通过了MSVC的静态代码分析,但对我来说,这看起来像是缓冲区溢出的行为。

我没有发现任何这样的错误看,但通常不会。我的问题是
A:我在别的地方搞砸了吗?我意识到我没有分享任何真实的代码,但是我错过了什么?这个计划在我重写了大部分代码之前就有效了。
B:有没有更简单的方法比仔细查看代码直到找到它为止?代码是跨平台的,所以我已经将它设置为在Ubuntu盒子上与Valgrind进行核对。

+3

请发布代码编译。特别是向我们展示'flag_type'中缺少'operator =='函数。还要在某处添加输出语句,并告诉我们预期的和实际的输出是什么。 – interjay

+0

难道这个问题出在你所反对的东西上吗?很难想象,一步一步地调试调试器(也许在汇编程序中),你仍然不会发现......接近downvote。 –

+0

请发布一个展示您的问题的工作示例。我的编译器说:':3:1:错误:'flag_type''之前的预期初始化器。我认为你错过了一些分号。 –

回答

0

感谢那些试图帮助的人。尽管如此,应注意的是,代码仅为,仅用于说明目的;我从头开始打字以表明一般情况正在发生;不去编译。回想起来,我意识到,让人们在如此少的信息上解决这个问题是不公平的 - 尽管我的实际问题“是否有更简单的方式比仔细地选择代码更简单”并没有真正关心实际解决问题 - - 只是如何处理它。

至于这个问题,在Ubuntu Linux上,我得到了“堆栈粉碎”,它或多或少地告诉我问题出现在哪里。有趣的是,堆栈粉碎的追踪是最有帮助的。长话短说,这是一个令人尴尬的基本错误; strcpy溢出(在〜,|和&的运算符中,标志具有以此方式设置的调试字符串)。至少它不是me谁写的代码。总是使用strncpy,人们:P