c ++代码中的分段错误

时间:2015-03-03 17:51:32

标签: c++ segmentation-fault

我有一个最近开始抛出分段错误的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
..
}

我想补充一点,在我遇到分段错误后,如果我再次使用相同的输入文件重新运行相同的可执行文件,第二次运行就不会有任何错误。谁能告诉我这种结果的原因是什么?

1 个答案:

答案 0 :(得分:2)

当然是的,segmentation fault即使之前没有发生也会发生。

首先,由于某些undefined behavior,您可能有一个SEGV,这在一般情况下是不可重现的。 UB可以是naughty

然后,支持C ++库可能已经改变,环境可能不同(因此main开头的堆栈可能不同)

最后,像ASLR之类的东西使得指针地址不可重现。

如果在Linux上,您可以禁用ASLR,使用所有警告和调试信息(g++ -Wall -Wextra -g)和-fsanitize=address编译代码,使用valgrind,当然还有{{1}调试器(例如,用于事后core(5)转储分析)。