2016-09-23 5 views
-4

私はこれに非常に新しいです。私は誰かがこれをアプローチする最良の方法にいくつかの洞察を提供することができればライン12 + 19この単純なCオーバーフローを修正するにはどうすればよいですか?

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

#define BUF_SIZE (1024) 

int main(int argc, char* argv[]) { 
    char* inBuf; 
    char* outBuf; 
    char* fmt = "the winner is: %s"; 

    inBuf = (char*) malloc(BUF_SIZE); 
    if (inBuf == NULL) { 
    return -1; 
    } 
    read(0, inBuf, BUF_SIZE); 
    outBuf = (char*) malloc(BUF_SIZE); 
    if (outBuf == NULL) { 
    return -1; 
    } 
    sprintf(outBuf, fmt, inBuf); 
    fprintf(stdout, "%s\n", outBuf); 
    fprintf(stderr, "%s\n", outBuf); 
    free(inBuf); 
    free(outBuf); 
} 

でピックアップされたバッファオーバーフローを除去するために、このコードを再書き込みしようとしていますか?大変ありがとうございます。

+1

C <> C++。これはC++コードではありません。タグはランダムに追加しないでください。タグはここで具体的な意味と関連性を持っています。あなたがコードを書いている言語がはっきりしない場合は、キーボードから指をはずし、何か他のことをしようとする前にそれを理解する必要があります。また、この問題を解決する方法を把握しようとしている場合は、どうやってそれをしようとしたかについていくつかの詳細を知っておく必要があります。これは、あなたが私たちにあなたに答えさせようとしている宿題と同じです。どのように進むべきだと思いますか? –

+1

あなたはBUF_SIZE文字を読んでいて、BUF_SIZE + 15をoutbufに書いています。また、あなたは読まれた結果をチェックしていません。 – stark

+1

また、 'read'は有効なC文字列を生成しません。つまり、NULターミネーターは追加されません。あなた自身でそれを行います: 'r = read(0、inBuf、BUF_SIZE-1); inBuf [r] = '\ 0'; 'これは、文字列の最後に改行文字を残すことに注意してください。 – kaylum

答えて

0

read関数を使用してユーザー入力を読み取るため、文字列ではなく生のバイトを読み取ることになります。だからそれは何を読み込んだNULL終了バイトを含まないので、mallocによって返されたバッファが初期化されていないので、nullで終わる文字列を持っていません。

mallocの代わりにcallocを使用します。これは、すべてゼロに初期化されたバッファを返します。

inBuf = calloc(BUF_SIZE + 1, 1); 

これは、終端ヌル文字のための余分なバイトを残すことに注意してください。

また、エラーのreadの戻り値をチェックしなければならない、とあなたはmalloc/calloc/reallocの戻り値をキャストshoudn't。

出力バッファサイズも小さすぎます。少なくとも入力文字列と書式文字列のサイズ以上でなければなりません。

outBuf = (char*) malloc(BUF_SIZE + 1 + strlen(fmt)); 
+0

'BUF_SIZE + 1'を割り当てるか、ヌルターミネータを手動で書きます。また、 'sprintf'フォーマット文字列によって引き起こされるオーバーフローを解決する必要があります –

関連する問題