脆弱なコードの改善
概要
FrontISTRのC言語およびFortranソースコードに、バッファオーバーフロー、メモリリーク、未チェックのエラーなど、複数のセキュリティ上の脆弱性・堅牢性の問題が存在します。本Issueでは、これらを体系的に修正します。
背景
静的解析やコードレビューにより、以下のカテゴリに該当する問題が多数確認されました。これらは通常の使用では顕在化しにくいものの、予期しない入力や大規模計算時にクラッシュ・データ破壊・セキュリティリスクにつながる可能性があります。
修正内容
1. sprintf → snprintf への置換(C言語・約120箇所)
sprintf はバッファサイズを考慮しないため、書き込み先のバッファを超過する潜在的なバッファオーバーフローの危険があります。snprintf に置換し、sizeof でバッファサイズを明示的に制限します。
対象モジュール: hecmw_control.c, hecmw_dist_refine.c, hecmw_visualizer.c, hecmw_vis_*.c, hecmw_dlb_*.c, fstr_ctrl_util.c 等
2. バッファサイズの拡張(C/Fortran)
ランク番号やステップ番号を含むファイル名・文字列の組み立てに使われるバッファが小さすぎ、大規模並列実行時にオーバーフローする恐れがあります。
- C:
char prefix[10]→char prefix[32]、char subname[10]→char subname[32]等 - Fortran:
character(len=4) :: cnum→character(len=12)、character(len=6) :: clyr→character(len=16)等
3. メモリアロケーションのエラーチェック追加(Fortran)
allocate 文に stat= 引数を追加し、失敗時にエラーメッセージを出力して適切に異常終了するようにします。
対象: fstr_setup.f90, readtemp.f90, bucket_search.f90 等
4. ファイルオープンのエラーチェック追加(Fortran)
open 文に iostat= 引数を追加し、ファイルオープン失敗時のエラーハンドリングを追加します。
対象: fistr_main.f90, fstr_precheck.f90, fstr_frequency_analysis.f90, fstr_setup.f90 等
5. メモリリーク・リソースリークの修正(C)
エラーパスでの fclose・free 漏れを修正し、リソースリークを防止します。
対象: hecmw_ablex.c, hecmw_dlb_*.c, hecmw_vis_*.c, fstr_rmerge_util.c 等
6. 解放前のNULLチェック追加(Fortran)
deallocate の前に associated() チェックを追加し、未割り当てポインタの解放によるランタイムエラーを防止します。
対象: fstr_rcap_io.F90
7. Fortranフォーマット文字列の修正
書式指定子内のカンマ欠落('(''####''a80)' → '(''####'',a80)')を修正します。
対象: fistr_main.f90