2016-04-26 10 views
0

Cでコードを書きましたが、strcpyは宣言されたバッファへの入力データです。ここでは、コードです:Cは2つのバッファにコピーされますが、1つだけは書き込まれます。

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

void function(char *args) { 
    char buff_1[12]; 
    char buff_2[3] = "ABC"; 

    strcpy(buff_1, args); 
    printf("buff_1: %s \n", buff_1); 
    printf("buff_2: %s \n", buff_2); 
} 

int main(int argc, char *argv[]) { 
    printf("Input: "); 

    if(argc > 1) 
    function(argv[1]); 

    return 0; 
} 

私は今、私はすべて11個の以上の入力引数は、バッファオーバーフローにつながることを前提としていますが、実際には、それは両方のバッファに私の入力を追加し、バイナリを実行する場合:

./main (perl -e 'print "A"x15') 
buff_1: AAAAAAAAAAAAAAA 
buff_2 :ABCAAAAAAAAAAAAAAA 

(gdb) x/1s buff_1 
0xffffd284: 'A' <repeats 11 times> 
(gdb) x/1s buff_2 
0xffffd281: "ABC", 'A' <repeats 11 times> 

私は、次のコマンドを使用してコードをコンパイル:

はまた、GDBを使用して変数をチェックすることは、私の入力引数は、両方のバッファに格納されていることを示しています3210を使用してくださいgcc (Ubuntu 5.2.1-22ubuntu2)

どのようにその可能性はありますか?

+0

まさに、バッファオーバーフローの結果がどうなると思いますか? –

+0

変数のアドレス( '%p')を表示すると、それらが魔法のように並んでいることがわかるので、" ABC "(最後にゼロがない場合)にbuff_2内容 – Koshinae

+1

また、まったくカウントしないでください。 'char buff_2 [] =" ABC ";'。コンパイラの警告を有効にします。 – Lundin

答えて

4

buff_2のヌル終了に十分なスペースがありません。したがって、printf("buff_2: %s \n", buff_2);はバッファオーバーフローし、結果はで、未定義の動作になります。

char buff_2[3] = "ABC"; // Not enough space for \0 
char buff_2[4] = "ABC"; // OK 
char buff_2[] = "ABC"; // OK, Size will be 4 
+0

私のコンパイラはこの行にエラーを投げます: 'char buff_2 [3] =" ABC ";':_'ABC ':配列の境界がオーバーフロー_ –

3

スペースよりも多くの文字をバッファに書き込むと、未定義の動作が発生します。予測可能な結果はありません。あなたがこれをするとき何も仮定することはできません。決定論的な実行時エラーを常に得ることは期待できません。

これは、引数のサイズを確認してからstrcpyに渡す必要があるためです。そうしなければバグです。

ここではバグがあります:char buff_2[3] = "ABC";。ヌル終了の余地が十分ではありません。有効なヌル終端のC文字列ではないため、配列を印刷しようとすると未定義の動作が呼び出されます。

関連する問題