什么C/C++函数最常使用不正确,可能导致缓冲区溢出?

MrV*_*dez 16 c c++ buffer-overflow buffer-overrun

我被要求维护一个充满内存泄漏的大型C++代码库.在探索时,我发现我们有很多缓冲区溢出导致泄漏(它如何变坏,我不想知道).

我决定先从危险函数开始删除缓冲区溢出.哪些C/C++函数最常使用不正确并可能导致缓冲区溢出?

对于用于帮助查找缓冲区溢出的编译器和/或工具,我创建了另一个处理此问题的问题

hay*_*lci 11

通常,任何不检查参数中的边界的函数.列表将是

  • 得到()
  • scanf()函数
  • 的strcpy()
  • strcat的()

您应该使用大小限制版本,如stncpy,strncat,fgets等.然后在给出大小限制时要小心; 考虑'\ 0'终止字符串.

此外,数组不受C或C++的约束.以下示例将导致错误.看到一个错误

int foo[3];
foo[3] = WALKED_OFF_END_OF_ARRAY;
Run Code Online (Sandbox Code Playgroud)

编辑:@MrValdez,@ Denton Gentry的复制答案

  • 使用strnxxx版本时,请注意它们可能会生成一个非空终止的字符串 (5认同)
  • 我不同意:检查参数范围的函数仍然是危险的。如果您可以使用 strcpy 进行溢出,那么您也可以通过错误的边界来使用 strncpy 进行溢出(例如,增加指针并忘记减少边界)。为了保护自己,请使用 std::string 或等效的 C 字符串库。 (2认同)

dic*_*oce 5

Valgrind是你最好的朋友.

valgrind --tool = memcheck --leak-check = full ./a.out


MrV*_*dez 2

以下是我发现的一些危险函数:

  • gets() - 它不检查变量的长度,并且如果输入大于变量的缓冲区,则可以覆盖内存。
  • scanf() - 我很高兴 Visual Studio 告诉我这个函数已被弃用。这是一个简单的修复。
  • strcpy() - 如果源的内存空间大于目标的内存空间,则覆盖目标之后的数据。