0

私の関数は、「ぶら下がっている参照」の警告を出している、つまり:

int mode_pos = 0, mode;
static char *s;
char buffer[FAT_BUFFER + 1];

chan->i_mode = chan->mode;
buffer[0] = 0;
s = buffer;
mode = chan->mode;

if (!mode)
        return NULL;
        ^^^^^^^^^^^^

ローカル変数 'buffer' に関連付けられたスタック メモリのアドレスは、呼び出し元に戻ったときにグローバル変数 's' によって引き続き参照されます。これはダングリングリファレンスになります

これは深刻ですか?実際に修正する最善の方法は何ですか?

4

2 に答える 2

3

ここでは、設計上の問題があるようです。sが実際にその 1 つの関数内でのみ使用され、無条件に に設定されている場合、それを使用bufferする意味はまったくありませんstatic。そうであれば、このダングリング リファレンスもそれほど危険なものではありませんが、驚きを避けるためにコードをクリーンアップすることをお勧めします。

于 2012-10-05T09:07:27.550 に答える
1

はい、深刻です。Undefined Behavior
の原因となります。の有効期間は関数のscope( , ) に制限されており、関数本体を超えて存続する場合と存続しない場合があります。動作するように見えることもあれば、失敗することもあります。動作が保証されているわけではなく、プログラムが定義された方法で動作することを期待することになるため、回避する必要があります。 buffer{}

buffer関数本体を超えて寿命が延びるように定義する必要があります。これを行うには、次の 2 つの方法があります。

  1. malloc()(呼び出し元はそれを覚えておく必要があります)を使用して動的メモリ割り当てを行うfree()か、
  2. bufferローカルとして宣言しstaticます。
于 2012-10-05T09:04:34.673 に答える