strcpyも使用しない
107日前原文(daniel.haxx.se)
概要
curlプロジェクトでは、**strncpy()とstrcpy()**の使用を廃止し、安全な文字列コピー関数へ移行。
**strncpy()**はAPIが不適切で、誤用リスクが高い関数。
**strcpy()**も安全性の観点から独自関数に置換。
新関数はバッファサイズや文字列長を明示的に扱い、バグを未然に防止。
AIによる誤検出も抑制可能だが、根本的な解決には至らない現状。
curlにおけるstrncpy()廃止の経緯
- **strncpy()**はAPI仕様が分かりにくく、誤用によるバグ発生源
- バッファ終端のnull文字未保証、余分なゼロ埋め発生
- 多くのコードベースで**strncpy()**の利用自体を避けるべきとの判断
- curlソースコードから**strncpy()**の呼び出しを完全廃止
- 文字列全体のコピーができない場合はエラーを返す方針
- 部分コピーが必要なケースはmemcpy()+明示的なnull終端で対応
- strlcpy等の代替関数も不要と判断
strcpy()の課題と置換理由
- **strcpy()**には一定の有用性があるが、APIが不十分
- バッファサイズや文字列長の明示的指定ができない
- 利用時は事前にバッファサイズチェックが必要
- 長期運用・複数人開発でチェックと呼び出しが分離しやすく、リスク増大
- バッファサイズチェックとコピー処理を密接に結合する必要性
独自string copy関数の導入
-
curlx_strcopy関数の新設
-
引数:ターゲットバッファ、バッファサイズ、ソースバッファ、ソース文字列長
-
コピー可能かつnull終端が収まる場合のみコピー実行
-
実装例:memcpy()+明示的なnull終端処理
-
**strcpy()**の完全禁止が可能に
-
利用は若干手間だが、安全性・保守性を優先
-
void curlx_strcopy(char *dest, size_t dsize, const char *src, size_t slen){ DEBUGASSERT(slen < dsize); if(slen < dsize) { memcpy(dest, src, slen); dest[slen] = 0; } else if(dsize) dest[0] = 0; }
-
AIによる脆弱性誤検出の抑制
- **strcpy()**のコード残存はAIによる脆弱性指摘の温床
- 独自関数への統一でAIの誤検出を抑制
- ただし、AIは他の箇所でも誤検出を継続する可能性
- AIによる誤検出問題の根本解決には至らない現状