读取某些文件时出现分段错误,似乎与文件大小无关

segmentation fault on reading certain files, seems to be unrelated to filesize

本文关键字:文件大小 错误 分段 文件 读取      更新时间:2023-10-16

感谢您花时间帮助我解决这个问题。

所以我在C++中制作了一个基于终端的文件管理器,并添加了一个读取文件的功能。 这有效,但对于某些文件,它始终抛出段错误。 这总是一致地发生在相同的文件中,但我还没有找到模式。 我的朋友建议这可能是一个尾随的换行符,但我尝试删除它们,它们仍然触发了段错误。 我调试了,找出了导致它的行,并使用 valgrind 创建了一个内存日志,两者都将包括在内。

我所知道的:

  • 如前所述,这似乎不是因为尾随换行

  • 文件大小似乎并不重要,因为最后一次发生在 2 字节文件上。但也在更大的文件上。

瓦尔格林德输出

如果您需要其他任何东西,请随时询问! :)

void viewFile()
{
clear();
attron(A_STANDOUT);
mvaddstr(0, 0, std::string(COLS, ' ').c_str());
mvaddstr(0, 0, "File Contents:");
attroff(A_STANDOUT);
std::string filePath = getSelectedFile().c_str();
std::ifstream file(filePath); // this line throws a segfault on some files
std::string line;
int index = fileViewStart;
int lineNumber = 0;
while (std::getline(file, line))
{
lineNumber++;
if (index - fileViewScrollOffset >= fileViewStart && index - fileViewScrollOffset < fileViewEnd)
mvaddstr(index - fileViewScrollOffset, 0, (std::to_string(lineNumber) + std::string(fileViewMarginLeft, ' ') + line).c_str());
index++;
}
mvaddstr(LINES - 1, 0, "Continue [ENTER]");
isShowingOutput = true;
isViewingFile = true;
}

由于它在ifstream构造函数上出错,并且您唯一的输入是文件名,这就是我首先要查找的地方。换句话说,请在尝试使用它之前打印出filePath

我的意思不一定只是std::cout << filePath << 'n'(尽管这可能足以看出问题(。您可能需要输出长度和每个字节,以防一些奇怪的东西逃逸到其中:-(


看到您的valgrind输出有很多警告,另一种可能性是您使用了内存中可能无效的值,即使存在编写良好的代码,这也肯定会导致问题:

  • Invalid read of size 1. Address 0x4f990e2 is 210 bytes inside a block of size 212 free'd.
  • Conditional jump or move depends on uninitialised value(s).
  • Use of uninitialised value of size 8.
  • Bad permissions for mapped region at address 0x48B2B30.

您可能还想更深入地研究这些问题。