3つのアプローチの比較

アプローチ 難易度 情報量 適した場面
静的解析
nm / objdump / AMBLIST
まず最初に実施。シンボル名・モジュール境界・外部参照を迅速に把握する。
逆コンパイル
cobc -C / Cobgen 等
コンパイルリストがなく、処理ロジックをある程度復元したい場合。結果はあくまで参考。
実行時トレース
SYSDUMP / strace / GDB
静的解析では判断できない動的 CALL・条件分岐のパスを確認したい場合。

静的解析ツールの選定と使い方

静的解析はモジュールを実行せずに構造を調べる方法です。安全性が高く、最初に実施すべきアプローチです。

Shell — 静的解析の基本コマンドセット(GnuCOBOL/Linux)
# ① シンボル表の確認(T=コード, D=データ, U=未定義外部参照)
nm -g libmodule.so

# ② 逆アセンブル(アセンブラレベルのコード確認)
objdump -d libmodule.so | head -100

# ③ セクション構成の確認
objdump -h libmodule.so

# ④ 文字列埋め込み情報(プログラム名・バージョン情報を探す)
strings libmodule.so | grep -E "[A-Z]{2,}[0-9]{4}|PROGRAM|VERSION|COBOL"

# ⑤ ELF ヘッダ確認(アーキテクチャ・ビット数)
readelf -h libmodule.so | grep -E "Class|Machine|Entry"

💡 SonarQube との組み合わせ

COBOL ソースが復元できた後、SonarQube の COBOL プラグイン(有償)を使うと、コード品質・重複コード・デッドコードの静的解析が自動化できます。モダナイゼーション前の棚卸しに有効です。

逆コンパイルの現実的な使いどころ

COBOL 専用の逆コンパイラは限られており、完全なソース復元は現実的ではありません。以下の方針で取り組んでください。

ツール / 方法対応環境特徴
GnuCOBOL -C オプション GnuCOBOL 環境 COBOL → C 変換で生成した C コードを参照。変数名は失われるが処理フローは追える。
IDA Pro / Ghidra ELF / PE 形式 汎用逆アセンブラ。COBOL の構造化コードには向かないが、関数境界・分岐の把握に使える。
ベンダー提供ツール Micro Focus / IBM Micro Focus Enterprise Analyzer など。商用ツールで依存関係グラフ・データフロー図を生成できる。

⚠️ 逆コンパイル成果物の扱い

逆コンパイルで得られたコードは「動作の参考資料」です。そのままソースとして使用しないでください。必ず PART 07 の検証手順で等価性を確認してください。

実行時トレース・SYSDUMP の活用

動的 CALL やデータ依存の条件分岐は、静的解析では把握できません。実行時に情報を収集します。

Shell — GnuCOBOL 実行時トレース(COB_SET_TRACE)
# GnuCOBOL の実行時トレースを有効化
export COB_SET_TRACE=Y
export COB_TRACE_FILE=trace.log

# プログラムを実行
./myprogram

# トレースログから CALL された段落・PROGRAM-ID を確認
grep -E "CALL|PROGRAM" trace.log | sort | uniq -c | sort -rn
JCL — z/OS SYSDUMP を取得して CALL 経路を調べる
//TESTJOB  JOB CLASS=A,MSGCLASS=X
//STEP1    EXEC PGM=YOURPROG,REGION=64M
//STEPLIB  DD   DSN=YOUR.LOADLIB,DISP=SHR
//SYSOUT   DD   SYSOUT=*
//SYSUDUMP DD   SYSOUT=*   ← ABEND 時のダンプ出力
//SYSIN    DD   *
  テスト入力データ
/*

SYSDUMP(SVCダンプ)の出力はIPCS(Interactive Problem Control System)で解析します。CALL スタック・PSW・レジスタの値からプログラムの実行経路を特定できます。

💡 strace(Linux)との組み合わせ

GnuCOBOL 環境では strace -e trace=file,process ./myprogram でシステムコールレベルのトレースが取得できます。動的ライブラリのロード順序・ファイルオープンパターンからモジュール構成を把握する際に有効です。

次の章では…

PART 06 では、調査・抽出フェーズで得た情報を元に、実際にソースファイルへ再構成する方法(モジュール境界の決め方・ファイル分割・コピーブック整理)を解説します。

→ PART 06 — ソースコードへの再構成へ