1
char *host;

host = malloc(64 * sizeof(char)); /* spazio per 64 caratteri */
memset(host,0x00,host[63]);

私は疑問を持っています:ポインタは「配列」として見ることができますか?
上記のコードで、64バイトにNULLを入れていますか?(バッファオーバーフローを防ぐため)

4

2 に答える 2

2

コードが正しかったとしても(@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");
于 2012-04-24T21:22:11.943 に答える
2

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]hosthost[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
于 2012-04-24T21:22:59.050 に答える