希望我能在不漏掉关键细节的情况下,把这件事说得一清二楚…
我有一个测试程序:
#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攻击。
问题可以关闭为“不再相关”。不管怎样,还是谢谢你!