我有一个最近开始抛出分段错误的c ++代码。我知道问题是由于未初始化的指针。但我怀疑这个代码突然开始抛出seg故障的原因。此代码自2010年以来未发生更改。是否可以在不更改代码的情况下发生分段错误? 这是代码:
void COB :: processfile()
{
ofstream *pbm_ptr; //uninitialiased ptr
..
while(currentRecord,readLine(_cobstream, FALSE))
{
...
if(_cobvalues[POS_REC_TYPE] == DETAIL)
{
pbm_ptr = null; //initialising
...
}
else
{
if(pbm_ptr != NULL)
*pbm_ptr << currentRecord(0,RECORD_LENGTH) << endl; //segmentation fault
..
}
我想补充一点,在我遇到分段错误后,如果我再次使用相同的输入文件重新运行相同的可执行文件,第二次运行就不会有任何错误。谁能告诉我这种结果的原因是什么?
答案 0 :(得分:2)
当然是的,segmentation fault即使之前没有发生也会发生。
首先,由于某些undefined behavior,您可能有一个SEGV,这在一般情况下是不可重现的。 UB可以是naughty。
然后,支持C ++库可能已经改变,环境可能不同(因此main
开头的堆栈可能不同)
最后,像ASLR之类的东西使得指针地址不可重现。
如果在Linux上,您可以禁用ASLR,使用所有警告和调试信息(g++ -Wall -Wextra -g
)和-fsanitize=address
编译代码,使用valgrind,当然还有{{1}调试器(例如,用于事后core(5)转储分析)。