概要
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による誤検出問題の根本解決には至らない現状