0

COBOL プログラムで CICS を使用していますが、CICS メモリからデータが書き出されることがあることに気付きました。データが破損し、アプリケーションが停止します。どこに追加されるのかわからないので、Cobol コードを分析して、CICS が使用する COMMAREA の破損の可能性を探すためのパーサーを作成しています。今、私は次のステートメントをチェックしました:

EXEC CICS XCTL
EXEC CICS LINK
EXEC CICS RETURN TRANSID

それぞれについて、送信された長さ (パラメーターで宣言されてLENGTHいる) が sent より大きくないかどうかを確認しますCOMMAREA。次にDFHCOMMAREA、受信プログラムの が送信されたものよりも大きくないかどうかを確認しますCOMMAREA(このドキュメントhttp://publib.boulder.ibm.com/infocenter/cicsts/v3r1/index.jsp?topic=%2Fcom.ibm.cics によると)。 ts31.doc%2Fdfhp3%2Fdfhp37t.htm ) :

受信データ域は、元の通信域と同じ長さである必要はありません。データの最初の部分のみにアクセスする必要がある場合は、新しいデータ領域を短くすることができます。ただし、通過する通信領域の長さを超えてはなりません。そうである場合、トランザクションは渡された領域外のデータを誤って読み取ろうとする可能性があります。また、領域外のデータを上書きする可能性があり、CICS が異常終了する可能性があります。

さて、メモリの上書きを検出するために他に何を解析すればよいのでしょうか?

4

4 に答える 4

1

NealB には良いアイデアがあります。また、 STGPROTおよびRENTPGM CICSシステム初期設定パラメータも調べることをお勧めします。

于 2012-01-26T01:25:36.217 に答える
1

データの受け渡し境界チェックには、常にトランスクルージョンを使用します。これは、COBOL では COPYCODE または COPYBOOK と呼ばれます。コピーコードでルート データ要素を渡し、呼び出し元と呼び出されたプログラムで同じバージョンをコンパイルします。この COPYCODE は、呼び出されたプログラムの一種の契約であるため、それらを結び付ける命名規則を用意することをお勧めします。それらが同期していることを確認するには、COPYCODE を変更するたびに、それを参照するすべてのプログラムを再コンパイルします。

また、SSRANGE の使用も優れています (ただし、既に誰かが言及しています)。

于 2012-04-06T14:42:01.783 に答える
1

Micro Focus COBOL を使用しているため、memory_strategy チューナブル (または CBL_MEM_STRATEGY API) を設定して、ランタイムがさまざまな方法でメモリを保護できるようにすることで、エラーが発生している場所を分析できます。

メモリーは、「CBL_MEM_VALIDATE」呼び出しを介して検証することもできます。

他にできることは、トレース サポートを使用することです... lookup CTF (Consolidated Tracing Facility)。これにより、エラー発生時のコードの位置がわかります。

あなたを助けるいくつかの参考文献;

http://kb.microfocus.com/display/4/kb/article.aspx?aid=31645

http://documentation.microfocus.com/help/index.jsp?topic=%2Fcom.microfocus.eclipse.infocenter.studee60win.sp02ws01%2FHRRTRHRTCF0O.html

http://documentation.microfocus.com/help/index.jsp?topic=%2Fcom.microfocus.eclipse.infocenter.studee60ux.sp02ws01%2FGUID-762085AC-8396-4D71-9CC1-6231551D3AEE.html

于 2012-02-10T13:14:08.877 に答える
0

CICSプログラムがメモリー全体に書き込みを開始すると、「動作を停止」するだけでなく、CICS領域もクラッシュする可能性があります。

がsとsLENGTHに正しく設定されていて、そのサイズ()のリンケージレコードに受信していることが確実な場合は、問題ないはずです。LINKXCTLCOMMAREAEIBCALEN

COBOLプログラムを解析しようとするのではなく、コンパイラの境界チェックオプションをオンに設定することをお勧めします。発生している問題は、作業用ストレージテーブルの範囲を超えたインデックス作成または添え字付けに関連している可能性があります。静的分析を通じてこのクラスのプログラミングエラーを検出しようとすることは、一般的にあまり効果的ではありません。

境界チェックをオンに設定すると、範囲外のメモリー参照が検出され、ログに診断メッセージが発行され、CICS領域全体がクラッシュする前にプログラムが終了します。ログに記録されたメッセージは、範囲外の参照が発生したソース行を示しているはずです。

SSRANGEコンパイル時オプションを確認してください。それが設定されていること、およびCICS領域がでLE対応プログラムを実行していることを確認してくださいCHECK(ON)

これにより、メモリ参照がすぐに範囲外になります。

于 2012-01-25T17:58:37.333 に答える