
2026/06/21 5:59
Linux、360 パッチと 6 年間の作業後に strncpy API を廃止します
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
Linux カーネルバージョン 7.2 では、6 年間にわたる準備(およそ 362 のコミット)を経て、廃棄済みの
strncpy API が公式に削除されました。この削除は、長年にわたり存在していた問題を解決するためのものであり、具体的には誤ったセマンティクス、文字列終端の不備、冗長なゼロ埋めによるパフォーマンス非効率といった課題に対応します。開発者は現在、より安全な代替手段を採用する必要があるためです:NULL 終端付きの目的地には strscpy() を、ゼロパディングが必要な場合は strscpy_pad() を、明示的なパディングを伴う有界コピーには memcpy_and_pad() を、NULL 終端のない固定幅フィールドには strtomem_pad() を、既知長さのメモリーコピーには memcpy() を使用してください。この最終段階により、同インターフェースを利用していた最後のユーザーが排除され、長期にわたる戦略としてメモリーの取り扱いを近代化し、曖昧性やクラッシュの原因となったレガシーコードを排除しました。本文
Linux カーネルバージョン 7.2 で strncpy
が正式に廃止されました
strncpy背景と経過
- 公式廃止: Linux カーネルバージョン 7.2において、カーネル内部で使用される
API がついに廃止されました。strncpy - 長年の課題: この関数は長年にわたり非推奨となっており、導入から 6 年以上が経過していました。
- 対策の成果: 数百のパッチを通じて緩和措置が講じられ、すべてのユーザー(カーネル内の使用箇所)が排除されました。
廃止の理由
過去数年間、
strncpy の利用は「バグの温床」とみなされてきました。主な理由は以下の通りです:
- 直感的でない動作: NUL(改行コード)による終結処理の挙動が予測困難でした。
- パフォーマンス問題: 目的先バッファへの余分なゼロ埋めが行われるため、性能低下を招いていました。
対応策と代替機能
今回のマージにより、
strncpy API および各 CPU アーキテクチャ向けの最後の strncpy 実装が削除されました。これに伴い、以下の関数を使ってください:
- NUL 終結あり: 目的先に NUL(改行コード)を付与する場合
strscpy() - ゼロ埋め+NUL 終結: 目的先をゼロ埋めし、かつ NUL で終結させる場合
strscpy_pad() - 固定幅コピー(NUL 終結なし): NUL に終結しない固定幅のフィールドへのコピーの場合
strtomem_pad() - 有界コピー: パディングを伴う有界コピーを行う場合
memcpy_and_pad() - 単純なメモリーコピー: 長さが既知のメモリーコピーを行う場合
memcpy()