-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”中都很好。但是,当我到达方法 3 时,“FLAG1.flag”已损坏,因此比较失败。

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

我通过查看没有发现任何此类错误,但当然通常不会。我的问题是
A:我在其他地方搞砸了吗?我意识到我没有分享任何真正的代码,但我已经错过了什么吗?这个方案在我重写大部分代码之前就已经奏效了。
B:有没有比更仔细地挑选代码直到找到它更简单的方法?该代码是跨平台的,所以我已经将其设置为在 Ubuntu 机器上使用 Valgrind 进行检查。

4

1 回答 1

0

感谢那些试图提供帮助的人。不过,应该注意的是,该代码仅用于说明目的;我从头开始输入它以显示一般情况正在发生;不编译。回想起来,我意识到要求人们在这么少的信息上解决它是不公平的——尽管我的实际问题“有没有比更仔细地挑选代码更简单的方法”并没有真正关心实际解决问题—— - 只是如何处理它。

As to this question, on Ubuntu Linux, I got "stack smashing" which told me more or less where the problem occurred. Interestingly, the traceback for stack smashing was the most helpful. Long story short, it was an embarrassingly basic error; strcpy was overflowing (in the operators for ~, | and &, the flags have a debug string set this way). At least it wasn't me who wrote that code. Always use strncpy, people :P

于 2012-06-30T21:56:18.557 回答