char *host;
host = malloc(64 * sizeof(char)); /* spazio per 64 caratteri */
memset(host,0x00,host[63]);
私は疑問を持っています:ポインタは「配列」として見ることができますか?
上記のコードで、64バイトにNULLを入れていますか?(バッファオーバーフローを防ぐため)
char *host;
host = malloc(64 * sizeof(char)); /* spazio per 64 caratteri */
memset(host,0x00,host[63]);
私は疑問を持っています:ポインタは「配列」として見ることができますか?
上記のコードで、64バイトにNULLを入れていますか?(バッファオーバーフローを防ぐため)
コードが正しかったとしても(@Dietrichの回答を参照)、バッファオーバーフローを防ぐことはできません。私がすることができます:
strcpy(host, "A very large string that's definitely a lot longer than 64 characters, so it will cause you a great deal of misery");
Cでは、ポインタは配列と見なすことができます。ただし、コードが間違っています。
正しいバージョン:
char *host;
host = malloc(64); // sizeof(char) == 1, guaranteed by the standard
if (!host) abort(); // malloc can return NULL if it fails
host[63] = '\0'; // put NUL byte into the last element of array
を実行すると、長さとしてmemset(host, 0x00, host[63])
格納されている値がmemsetに渡されます。これはエラーです。初期化されていないため、ガベージであり、ガベージをに渡さないでください。運が良ければ、プログラムはすぐにクラッシュします。運が悪ければ、そうはなりません。host[63]
host
host[63]
memset
バイト\0
をの最後のスロットに入れることはhost
、ほとんどのバッファオーバーフローを回避しません。ほとんどの異なるタイプのバッファオーバーフローは個別に処理する必要があるため、それらを防ぐ「1つの方法」はありません。
バッファオーバーフローはプログラミングミスのクラスであり、ほとんどのクラスのミスと同様に、それらを作成する方法はたくさんあります。それぞれの異なるバッファオーバーフローは、修正する必要のある誤ったコードの一部にすぎません。
用語の注意:NULL
Cでは「NULL」という名前の無効なポインタNUL
を参照し、ASCII文字列ではゼロバイトを参照するために使用することを好みます。例えば、
// Initialize ptr to a NULL ptr...
char *ptr;
ptr = NULL;
ptr = 0; // equivalent to above
ptr = xmalloc(15);
// Set *ptr to the NUL byte...
*ptr = '\0';
*ptr = 0; // equivalent to above