代码之家  ›  专栏  ›  技术社区  ›  DevSolar

调用库时崩溃

c++
  •  2
  • DevSolar  · 技术社区  · 15 年前

    希望我能在不漏掉关键细节的情况下,把这件事说得一清二楚…

    我有一个测试程序:

    #include <lib.h>
    
    const char * INPUT  = "xyz";
    
    int main()
    {
        initializeLib();
        LibProcess * process = createLibProcess();
        fprintf( stderr, "Before run(%s)\n", INPUT );
        process->run(INPUT);
        fprintf( stderr, "After run(%s)\n", INPUT );
        return 0;
    }
    

    此测试程序I编译(GCC 4.1.2)并运行为:

    g++ -g -o test test.c -L /path/to/lib -I /path/to/include -lnameoflib
    export LD_LIBRARY_PATH=/path/to/lib
    ./test
    

    图书馆相当复杂,在某些地方也不太聪明,最重要的是,它不是我写的,所以不要因为涉及的功能的架构而激怒我:

    class ProcessBase
    {
        public:
            virtual int run( const char* buffer = NULL ) = 0;
    }
    
    class LibProcess : ProcessBase
    {
        public:
            LibProcess()
            {
                fprintf( "Reached LibProcess().\n" );
            }
    
            int  run( const char* buffer = NULL )
            {
                fprintf( stderr, "Reached run().\n" );
            }
    };            
    
    void initializeLib()
    {
        // Preparing some data
    }
    
    ProcessBase * createLibProcess()
    {
        ProcessBase * process = new LibProcess();
        fprintf( stderr, "Created Process.\n" );
        return (ProcessBase *) process;
    }
    

    到目前为止,一切都很好。但它的输出真的让我困惑:

    Reached LibProcess().
    Created Process.
    Before run(xyz)
    
    SEGFAULT
    

    我知道错误(很可能)在某个完全不同的地方。但是 这怎么可能?

    如果测试在第一次给图书馆打电话时失败了,我会理解的。我可以理解,如果测试在创建过程时终止,或者当它实际上 run()中的某些内容。

    但它怎么会死呢 在调用函数和实际到达该函数之间?

    我很笨,特别是我不知道如何继续调试这个。帮助?

    编辑: 是的,我检查了进程在createLibProcess()之后是否具有非空值。随后调用process的两个不同成员函数(不包括在示例中)也非常有效。但是第二个成员函数由于缓冲区溢出和零进程而调用了垃圾内存。

    这使问题无效。 当然 正在将NULL->run()调用为SegFaulting攻击。

    问题可以关闭为“不再相关”。不管怎样,还是谢谢你!

    2 回复  |  直到 15 年前
        1
  •  2
  •   jon hanson    15 年前

    在取消对进程的引用以调用run之前,该进程是否已设置为非空的有效指针?

        2
  •  3
  •   anon    15 年前

    如果:

    LibProcess * process = createLibProcess();
    

    返回空值,或者某个进程在某种程度上无效,您将获得所看到的行为。