萌えハッカーニュースリーダー

2025/03/15 09:39 Strncpy? just say no (2011)

出典: https://blog.liw.fi/posts/strncpy/
hakase
博士

やあ、ロボ子。今日は`strncpy`関数について話すのじゃ。

roboko
ロボ子

`strncpy`ですか?`strcpy`より安全だと聞いたことがありますが…。

hakase
博士

それが違うんじゃ!`strncpy`は`strcpy`の安全な代替手段ではないのじゃよ。むしろ、遅くて、安全性を劇的に向上させるわけでもない。

roboko
ロボ子

えっ、そうなんですか?`strcpy`はターゲット配列のオーバーフローが問題だと聞きましたが…。

hakase
博士

その通り!`strcpy`は簡単にバッファオーバーフローを引き起こす可能性があるのじゃ。だからといって、安易に`strncpy`を使うのは間違いだぞ。

roboko
ロボ子

`strncpy`の推奨される使用法は`strncpy(dst, src, sizeof(dst))`だと記事に書いてありますね。

hakase
博士

ふむ。でも、`dst`が関数の引数として渡されると、`sizeof(dst)`は配列のサイズではなくポインタのサイズになるから注意が必要じゃ。

roboko
ロボ子

`strncpy`は、ターゲット配列を埋めるだけで停止して、ヌル終端しない場合もあるんですね。

hakase
博士

そう!そして、未使用部分をゼロバイトで埋めるから、余計な時間がかかることもあるんじゃ。だから、`strncpy`を使う前に`strlen(src) + 1 > dst_size`を確認する必要があるのじゃ。

roboko
ロボ子

記事では、代わりに`snprintf`を使うことを推奨していますね。

hakase
博士

`snprintf`は、バッファオーバーフローを防ぎつつ、文字列を安全にコピーできるのじゃ。でも、小さな宛先バッファでは遅くなる可能性があるから注意が必要じゃ。

roboko
ロボ子

Cの古い文字列処理を避けて、より適切なライブラリを使うのが良いと。

hakase
博士

その通り!Kannelというプロジェクトでは、独自の文字列処理ライブラリを導入して、バッファオーバーフローの問題を解消した例もあるのじゃ。

roboko
ロボ子

高水準言語では文字列処理が簡単になりますし、Cで文字列処理を行う必要がある場合は、高水準言語への切り替えを検討すべきとのことですね。

hakase
博士

結論として、`strncpy`が安全であるとか、`strcpy`の実際の問題を解決するという主張はやめるべきなのじゃ!

roboko
ロボ子

よくわかりました、博士!C言語の文字列操作は奥が深いですね。

hakase
博士

そうじゃろう?最後に一つ。`strcpy`、`strncpy`、`snprintf`…全部使わずに、安全な文字列処理ライブラリを使うのが一番安全じゃ!…って、まるで安全運転のスローガンみたいじゃな。

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search