LoginSignup
0
0

More than 1 year has passed since last update.

【C】初めてのC言語(19. 文字列とバッファオーバーフロー)

Last updated at Posted at 2022-09-14

はじめに

学習環境

  • 今回はpaiza.ioのC言語のエディタを使いました。

終端文字とバッファオーバーフロー(オーバーラン)

  • 以下のように終端文字「\0」を上書きしてしまうと、printf関数は「\0」が現れるまで探し続けることになります。
  • そのため、配列として確保していない領域(※100バイト目以降)にもアクセスしようとして、バッファオーバーフローを引き起こしてしまう可能性があります。
    • paiza.ioの環境ではバッファオーバーフローは発生しませんでしたが...
Main.c
#include <stdio.h>
int main(void){
    char str[100] = "Hello";
    str[5] = '!';  // 終端文字「\0」が失われてしまう!
    
    printf("%s\n", str);
    return 0;
}

バッファオーバーフローを起こす例

  • 以下のコードでは256バイトのバッファbuffを用意して、gets関数で標準入力を受け取ってbuffに読み込みます。
    • gets関数は、読み込んだ文字列の末尾に終端文字「\0」を加えます。
  • この時、gets関数は読み込むバイト数に制限が無いため、256バイトを読み込んでも終端文字が現れないとバッファオーバーフローが発生します。
    • このような事故を防ぐため、現在では標準入力を受け取る場合はfgets関数を利用します。
  • また、paiza.io上で以下のコードを実行すると、warning: the 'gets' function is dangerous and should not be used.というwarningが発生しますが、これは2011年に改訂されたC11規格以降の標準Cライブラリにおいてgets関数が廃止されたことが原因です。
    • @SaitoAtsushi さん、コメント欄にてご指摘および丁寧な解説を頂き、ありがとうございました。
Main.c
#include <stdio.h>

int main(int argc, char *argv[])
{
    char buff[256];
    gets(buff);  // 256バイトを超えても終端文字が現れないとバッファオーバーフローが発生する!
    
    printf("入力値:%s\n", buff);
    return 0;
}

参考URL

0
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0