C言語でgets関数の使い方や脆弱性についてわかりやすく詳しく解説

この記事では、C言語のgets関数について詳しく解説します。

gets関数の概要や使い方、そしてその脆弱性について学ぶことができます。

また、gets関数の代替手段として推奨されるgets_s関数についても紹介します。

C言語のプログラミング初心者の方にもわかりやすく解説していきますので、ぜひ最後までお読みください。

目次から探す

gets関数とは

gets関数は、C言語で文字列を入力するために使用される関数です。

この関数は、標準入力から改行文字(Enterキー)が入力されるまでの文字列を受け取ります。

gets関数の概要

gets関数は、以下のような形式で定義されています。


char* gets(char* str);

この関数は、引数として文字列を格納するためのchar型の配列(またはポインタ)を受け取ります。

そして、改行文字が入力されるまでの文字列をその配列に格納します。

最後に、格納された文字列の先頭アドレスを返します。

gets関数の使い方

gets関数を使用するためには、以下の手順を実行します。

  1. 文字列を格納するためのchar型の配列(またはポインタ)を宣言します。
  2. gets関数を呼び出し、入力された文字列を配列に格納します。
  3. 入力された文字列を処理するために、配列の内容を使用します。

以下に、gets関数の使い方の例を示します。


#include <stdio.h>
int main() {
    char str[100]; // 文字列を格納するための配列
    printf("文字列を入力してください:");
    gets(str); // 文字列の入力
    printf("入力された文字列:%s\n", str); // 入力された文字列の表示
    return 0;
}

この例では、ユーザーに文字列の入力を促し、gets関数を使用して入力された文字列を配列に格納しています。

最後に、入力された文字列を表示しています。

gets関数の脆弱性

バッファオーバーフローとは

バッファオーバーフローとは、プログラムが確保したメモリ領域を超えてデータを書き込むことを指します。

C言語において、文字列を扱う際には、文字列を格納するためのバッファ(配列)を使用します。

しかし、バッファのサイズを超えたデータを書き込むと、そのデータは隣接するメモリ領域に書き込まれてしまいます。

これにより、プログラムの動作が予期しないものになる可能性があります。

gets関数の脆弱性の原因

gets関数は、ユーザーからの入力を受け取るための関数です。

しかし、gets関数は入力の長さを制限せず、バッファオーバーフローが発生する原因となります。

具体的には、gets関数は改行文字(‘\n’)までの文字列を受け取りますが、改行文字を含む文字列を入力すると、バッファの範囲を超えたデータが書き込まれてしまいます。

以下に、gets関数の脆弱性を示すサンプルコードを示します。


#include <stdio.h>
int main() {
    char buffer[10];
    
    printf("文字列を入力してください:");
    gets(buffer);
    
    printf("入力された文字列:%s\n", buffer);
    
    return 0;
}

上記のコードでは、10文字のバッファを用意していますが、gets関数は入力の長さを制限しないため、11文字以上の文字列を入力するとバッファオーバーフローが発生します。

このような脆弱性があるため、gets関数は非推奨とされており、代わりにgets_s関数を使用することが推奨されています。

gets関数の代替手段

C言語において、gets関数は文字列を入力するために使用される関数ですが、その使用は非推奨とされています。

そのため、gets関数の代替手段として、C11規格から導入されたgets_s関数を利用することが推奨されています。

gets_s関数は、安全な文字列の入力を行うために設計されており、バッファオーバーフローのリスクを低減することができます。

以下に、gets_s関数の使い方の例を示します。


#include <stdio.h>
int main() {
    char str[100];
    printf("文字列を入力してください: ");
    gets_s(str, sizeof(str));
    printf("入力された文字列: %s\n", str);
    return 0;
}

上記の例では、gets_s関数を使用して文字列を入力しています。

gets_s関数は、第1引数にバッファのポインタ、第2引数にバッファのサイズを指定します。

バッファのサイズを超える入力が行われた場合、余分な文字は切り捨てられます。

gets_s関数は、安全な文字列の入力を行うための代替手段として利用することができます。

バッファオーバーフローのリスクを低減するために、gets関数の使用は避け、gets_s関数を使用することをおすすめします。

目次から探す