2

私は最近、次のコードの隠れた問題は何かというインタビューの質問に直面しました。私はそれを検出できませんでした。誰か助けてくれますか?

#include<stdio.h>

int main(void)
{
    char buff[10];
    memset(buff,0,sizeof(buff));

    gets(buff);

    printf("\n The buffer entered is [%s]\n",buff);

    return 0;
}
4

5 に答える 5

5

関数stdin から文字列を受け取り、バッファの容量をチェックしません。これにより、バッファ オーバーフローが発生する可能性があります。ここでは、標準関数fgets()を使用できます。

于 2013-05-17T02:57:06.683 に答える
2

gets10 文字をはるかに超える文字が返される可能性があります。

gets は、最大 10 の長さまで「buff」を埋めるように指示できないため、非常に問題があります。

于 2013-05-17T02:56:05.157 に答える
1

このマニュアルのバグセクションを確認してください

   Never use gets().  Because it is impossible to tell without knowing
   the data in advance how many characters gets() will read, and because
   gets() will continue to store characters past the end of the buffer,
   it is extremely dangerous to use.  It has been used to break computer
   security.  Use fgets() instead.

   It is not advisable to mix calls to input functions from the stdio
   library with low-level calls to read(2) for the file descriptor
   associated with the input stream; the results will be undefined and
   very probably not what you want.
于 2013-05-17T03:08:43.033 に答える
0

gets() よりも fgets()/scanf() を使用することを常にお勧めします。

于 2013-05-17T03:11:39.153 に答える
0

関数 gets() を使用すると、ユーザーを特定のテキスト長に制限するオプションがなくなり、バッファ オーバーフロー例外が発生する可能性があります。そのため、使用しないでください。

代わりに fgets() を使用してみてください: fgets(buff, MAX_LENGTH_ stdin);

幸運を!

于 2013-05-17T06:23:03.267 に答える