私は最近、次のコードの隠れた問題は何かというインタビューの質問に直面しました。私はそれを検出できませんでした。誰か助けてくれますか?
#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;
}
関数はstdin から文字列を受け取り、バッファの容量をチェックしません。これにより、バッファ オーバーフローが発生する可能性があります。ここでは、標準関数fgets()を使用できます。
gets
10 文字をはるかに超える文字が返される可能性があります。
gets は、最大 10 の長さまで「buff」を埋めるように指示できないため、非常に問題があります。
このマニュアルのバグセクションを確認してください
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.
gets() よりも fgets()/scanf() を使用することを常にお勧めします。
関数 gets() を使用すると、ユーザーを特定のテキスト長に制限するオプションがなくなり、バッファ オーバーフロー例外が発生する可能性があります。そのため、使用しないでください。
代わりに fgets() を使用してみてください: fgets(buff, MAX_LENGTH_ stdin);
幸運を!