调用函数会覆盖值

时间:2012-06-30 08:56:50

标签: c++

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

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

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。

1 个答案:

答案 0 :(得分:0)

感谢那些试图提供帮助的人。但是,应该注意的是,代码仅用于说明目的;我从头开始打字显示一般情况正在发生;不要编译。回想起来,我发现要求人们用如此少的信息来解决这个问题是不公平的 - 尽管我的实际问题是“有更简单的方法而不是更仔细地检查代码”并不真正关心实际解决问题 - - 如何接近它。

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