c++代码中的分段错误

Segmentation fault in c++ code

本文关键字:分段 错误 代码 c++      更新时间:2023-10-16

我有一个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
..
}

我想再补充一点,在我出现分段错误后,如果我用相同的输入文件再次运行相同的可执行文件,第二次运行不会有任何错误。有人能告诉我造成这种结果的原因吗?

当然,分段错误可能会发生,即使以前没有发生过。

首先,您可能因为一些未定义的行为而产生SEGV,这在一般情况下是不可复制的。UB可能真的很顽皮。

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

最后,像ASLR这样的东西使得指针地址不可复制。

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