extern 変数をソース バッファーとして扱い、それを引数として strcpy() またはバッファー オーバーフローを引き起こす可能性のあるその他の関数に渡すことは、安全でなく、引数を渡すのと同じくらいバッファー オーバーフローを引き起こす可能性があるかどうか疑問に思っていました。バッファのサイズよりも大きい制限が指定された fgets() 関数からのものです。
これらの extern 変数には特別な注意を払うべきですか、それとも他の変数と同じように扱うべきですか?
extern 変数をソース バッファーとして扱い、それを引数として strcpy() またはバッファー オーバーフローを引き起こす可能性のあるその他の関数に渡すことは、安全でなく、引数を渡すのと同じくらいバッファー オーバーフローを引き起こす可能性があるかどうか疑問に思っていました。バッファのサイズよりも大きい制限が指定された fgets() 関数からのものです。
これらの extern 変数には特別な注意を払うべきですか、それとも他の変数と同じように扱うべきですか?
extern
変数のリンケージを定義するだけで、他の方法で変数を変更することはありません。
安全かどうか?
他の変数と同じように安全/安全でextern
はなく、宣言されている変数には関係がありません。
使用strcpy
自体は安全ではなく、バッファ オーバーフローを引き起こす可能性があります。
C++ では、より良いオプションを使用することですstd::string
変数の使用を完全に制御すると仮定すると、他の「グローバル」またはローカル変数と同じくらい「安全」になります。変数の使用とその作成方法を制御できず (たとえば、リンク先のモジュールを他の人が提供している場合)、そのコーディング プラクティスを知らない場合は、変数をより多くの方法で扱うことがおそらく賢明でしょう。通常の懐疑論よりも。
ただし、一般的には、変数の使用を完全に制御する場合でも、当然のことながら、ターゲット バッファー長を受け入れる "安全な" strcpy 関数のいずれかを使用することをお勧めします。
に引数を渡すことstrcpy
は安全ではなく、バッファ オーバーフローが発生する可能性があります。extern
この事実とは関係ありません。賢者はstd::string
(または Unicode をサポートするバリアント) を使用しますが、それらのいずれchar*
かstrcpy
またはいずれかを使用することはありません。