首先,不要使用
gets
。现在几乎每个人都知道
gets
可能会出现的所有安全和可靠性问题。但是由于历史原因,它仍然被包含在这里,因为它是一个非常糟糕的编程示例。
让我们来看看代码中的所有问题:
// Really bad code
char line[100];
gets(line);
由于 gets
函数不做边界检查,长度超过100个字符的字符串会覆盖内存。如果你很幸运程序只会崩溃,或者它可能表现出奇怪的行为。
gets
函数是如此糟糕,以至于 GNU GCC 链接器在使用它时会发出警告。
/tmp/ccI5WJ5m.o(.text+0x24): In function `main':
: warning: the `gets' function is dangerous and should not be used.
使用assert保护数组访问
C/C++不会进行边界检查。
例如:
int data[10]
i = 20
data[20] = 100 //Memory Corruption
使用assert
函数来检查以上代码
#include<assert.h>
int data[10];
i=20
assert((i >= 0) && (i < sizeof(data) / sizeof(data[0]))); // throws
data[i] = 100
数组溢出是最常见的编程错误之一,而且极其令人沮丧难以定位。这段代码虽然不能消除它们,但它确实会使有缺陷的代码在早期崩溃,从而使问题变得更容易找到。
并使用snprintf(buffer, sizeof(buffer), "%s", "abcdefghpapeas")
和一些工具,如valgrind或GDB。
希望这能帮助你。
snprintf(buffer, sizeof(buffer), "%s", ...)
。 - mvp-fstack-protector-strong-but-i-mean-for-real-now
选项或其他类似选项吗? - n. m.