首先不要使用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.
使用断言保护数组访问
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。
希望这可以帮助你..