使用malloc与struct时偶发core dump或段错误的排查求助
以下是导致代码偶尔触发核心转储或段错误的关键问题:
内存越界写入(process函数)
process函数直接将处理后的内容写入dest(即pr->data),但dest的初始分配大小仅为原文件尺寸+1。而代码逻辑中会将LF替换为LF + ASCII 1,相当于每行额外写入一个字节;如果原文件有大量行,处理后的总字节数会超过初始分配的内存空间,导致堆内存越界写入,破坏堆管理的元数据。后续的realloc、free等内存操作一旦访问被破坏的元数据,就会触发段错误。空指针解引用(strchr返回NULL)
strchr(pr->data, '\n')用于定位首行末尾的换行符,如果目标文件为空、或只有一行且无换行符,该函数会返回NULL。此时代码执行strchr(...) + 1,相当于对NULL指针做算术运算,得到的非法指针传入process函数后,访问*c会直接触发段错误。process函数的无限循环与指针跑飞
process函数的主循环是无终止条件的for (c = src, o = dest;; c++),仅当遇到%或\0时才会返回。如果处理过程中指针c因越界写入跑到了没有终止符的内存区域,会进入无限循环,直到访问系统保护的非法内存区域,触发段错误。realloc失败后的空指针风险
pr->data = realloc(pr->data, pr->fSize);直接将realloc的结果赋值给pr->data,如果realloc失败返回NULL,原有的pr->data指针会被覆盖为NULL。后续代码中访问pr->data会触发空指针解引用;同时,原有的内存地址丢失,还会造成内存泄漏。blockcnt计数错误导致数组越界
process函数中n(最终赋值给blockcnt)的计数逻辑存在问题:当遇到无匹配右括号的行时,代码会忽略整行,但n仍会因case '\n'执行n++,导致blockcnt比实际有效行数多。后续pr->block的内存分配基于错误的blockcnt,循环填充pr->block时会超出数组边界,触发段错误。process处理'('时的指针越界
处理左括号case '('时,循环for (com = o; *c != '\n' && *c != ')';) *o++ = *c++;没有限制指针c的范围。如果左括号后既没有右括号也没有换行符,c会一直走到pr->data的末尾之外,访问非法内存区域,触发段错误。
内容的提问来源于stack exchange,提问作者user3479526

