1. 程式人生 > >C++緩衝區溢位

C++緩衝區溢位

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/