gets(char* ) 根本不執行邊界檢查,它會向緩衝區連續寫入,其危險級別可以說是近乎C/C++中最高。
遇到 EOF 字符或換行字符之前,不會停止讀入文本,這還都不算什麼,這個函數最可怕的一點是會寫出堆溢出;
作爲一個替代方法,可以使用方法 fgets()。它可以做與 gets() 所做的同樣的事情,但它接受用來限制讀入字符數目的大小參數,因此,提供了一種防止緩衝區溢出的方法。
一般來說在C/C++中出現棧溢出的問題比較多見(gets,strcpy等都能很容易做到),堆溢出可以說是極難極難實現,這實在是太可怕了...
示例如下:
#include <iostream>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
using namespace std;
void AllocHeap(void** p, int bytecount)
{
*p = malloc(bytecount);
}
int main()
{
char *number;
char *letter;
AllocHeap((void**)&letter, 10);
AllocHeap((void**)&number, 10);
strcpy(number, "12345678");
printf("please input some letters: ");
gets(letter);
printf("Number: %s\n", number);
printf("Letter: %s\n", letter);
return 0;
}
please input some letters: abcdefghijklmnopqrstuvwxyz Number: yz
Letter: abcdefghijklmnopqrstuvwxyz
使您的軟件運行起來: 防止緩衝區溢出
這篇文章很不錯的,轉自:
http://www.ibm.com/developerworks/cn/security/buffer-defend/