2017-06-26 8 views
-3

dest_bufferバッファに8つの英数字記号を書き込む際に問題があります。1つのバッファから別のバッファにキャストおよびコピーする際にスタックが壊れる

私はcharからbuffを16進数に変換したいのですが、 の異なるdest_bufferバッファの値に値を格納します。例えば

バフ[0] = 58 [0] = '3' とdest_buffer dest_buffer私を与えるべきである[1] = '' 等が8つの文字に到達します。

srcはchar [8 * sizeof(int)+1]で、buffは同じです。 残念ながら、私はこれだけの出力を持っている:

2dbb771 
*** stack smashing detected ***: ./a.out terminated 
[1] 9843 abort (core dumped) ./a.out 

これは私が何かが欠けていないんだけど、私は何を知っていない、どちらもどこ知っている私は

for (i = 0; i < 4*sizeof(int); ++i) 
{ 
    snprintf (
     &dest_buff[i*sizeof(int)*2], 
     sizeof(int)*2, 
     "%x", 
     *(int*)&buff[i * sizeof(int)] 
     ) ; 
} 

仕事をするために使用したループであります、 私のお手伝いができますか? おかげ

EDIT 1:ここでは

は、より正確には、私のコードの別の部分である。この後

int i, rndf ; 
char buff[4*sizeof(int)+1]; 

rndf = open("/dev/urandom", O_RDONLY) ; 
if(read (rndf, buff, 4*sizeof(int)) < 0) 
{ 
    fprintf (stderr, "%s\n", "An error occured while reading urandom") ; 
    exit (EXIT_FAILURE) ; 
} 
close(rndf) ; 

char buff[4*sizeof(int)+1];があるので、あなたは腐敗を積み重ねてきたループ

+0

スタックオーバーフローの可能性がありますか? 'dest_buff'とは何ですか?そのサイズは? – tilz0R

+0

@ tilz0R私は推測しますが、私はどこに、なぜ、私はここにこだわっている見つけることができませんでした – Default

+0

私たちのすべてのコードを表示するだけのループではありません。どのように初期化されますか。 – tilz0R

答えて

0

来ますあなたの変数。

sizeof(int)4バイトであるとします。可変サイズは17バイトです。

&dest_buff[i*sizeof(int)*2]あなたはいつでも(i = 3の場合)アドレスオフセット3 * 4 * 2 = 24にアクセスしていますが、これは変数の範囲外です。

結論:は未定義の動作です。可変長を増やすか、ポインタの使用を修正してください。

+0

ありがとう、私は私のポインタを修正するために探している、それは私の多くを助けた! – Default

+0

範囲外が主な問題ではありません。 – Olaf

+0

@Olaf別のコードレビューの後、私たちは実際には 'dest_buff'の目に見えるサイズがないので、何が問題なのか分からないので、私の答えは無駄です。 – tilz0R

関連する問題