1

Olimex LPC2378-STK でいくつかの作業を行っています。

以下の宣言があります。

unsigned char buffer[256];

次に、次のことを試みます。

strncpy((char *)buffer, "CREATED_BY", 255);

これが問題を引き起こす理由を誰かが知っていますか。

コード行をコメントアウトすると、問題なく実行されますが、使用するとプログラムが停止するようです。

誰でもアイデアはありますか?

4

3 に答える 3

5

あなたが投稿したコードに本質的な問題はありませんが、コンテキストがありません。たとえばbuffer[]、ローカル変数の場合、スタック上に作成され、スタックがオーバーフローしている可能性があります。

スタック オーバーフローを確認する問題が解決するかどうかを確認するために、静的に宣言することができます。変数を一時的にする必要がある場合は、適切に大きなスタックを割り当てる必要があります。

スタック オーバーフローは特に strncpy で発生しない場合があることに注意してください。bufferスタック内に含まれている可能性がありますが、そのサイズが他のオブジェクトをスタックの外に押し出し、それらへの書き込みがスタックの破損を引き起こす可能性があります。通常、失敗のポイントは、関数が破損したリターン アドレスを使用して返そうとしたときです。デバッガーを実際に使用してコードをステップ実行し、呼び出しスタック、スタック ポインターで何が起こっているか、関数が strncpy で失敗したかどうか、または呼び出し元の関数が戻ったときに失敗したかどうかを確認する必要があります。

コードの安全性と保守性に関する 1 つのポイント:

strncpy((char *)buffer, "CREATED_BY", sizeof(buffer) - 1);

イニシャライザをより便利に使用することもできます。

unsigned char buffer[256] = "CREATED_BY" ;
于 2013-02-24T08:50:51.323 に答える
1

strncpy では多くのことがうまくいかない可能性があります。

  1. 割り当てていないメモリに書き込もうとしている、NULL アドレスを持っている、または権限がない (へのキャストchar *は非常に疑わしい)、
  2. バッファの内容は NUL で終了していません
  3. 何かを上書きして、バッファをオーバーフローさせています。

デバッガーを使用します。

于 2013-02-24T09:25:09.620 に答える
0

私はあなたが報告しているのと同じ問題に対処しました。

私に起こったことは、HEAPメモリ用のスペースを予約するようにスタートアップコード(keilを使用している場合)を構成していなかったことです。printfファミリ関数はmallocとfreeを使用するため、HEAPスペースは必須です。

GCCを使用している場合、問題はnewlibが正しくセットアップされていないことです。ヒープを確認してください。

于 2013-03-11T20:48:31.100 に答える