呼び出しプロトタイプのポインタの明示的および暗黙的な定義

制限事項: このトピックは UNIX 環境にのみ適用されます。

デモンストレーション・プログラム demo3.cbl は、スキャンされるプログラム内でポインタの暗黙的な定義を作成するためにプロトタイプを使用する方法、および非互換パラメータのレポート方法を示しています。

  1. 中間コード・ファイルを作成します。 Windows:
    cobol demo3.cbl /anim /nognt;
    UNIX:
    cob -a demo3.cbl
    このプログラムで注視すべきパラメータは、ptrnum-g グループ項目です。このプログラムで使われる各種の呼び出しのプロトタイプなしに、このソース・ファイルは Scan64 を問題なく渡します。
  2. 次のコマンドを入力して、このプログラムで Scan64 を実行します。Windows:
    cobscan64 demo3
    UNIX:
    cobscan64 demo3
    これにより次のレポートが生成されます。
    Processing file 'demo3.int' 
    Finished file 'demo3.int' - pointer usage is OK
  3. 一方、プロトタイプを指定すると、プログラムは Scan64 を渡しませんが問題は生じません。例えば、次を指定すると、Windows:
    cblscan64 -m -t demoproto.cpy demo3
    UNIX:
    cobscan64 -m -t demoproto.cpy demo3
    次のレポートが得られます。
    Processing file 'demo3.int' 
    **Possible unsafe modification of 'BY REFERENCE' pointer parameter 
    **in CALL 'CBL_ALLOC_MEM' statement at (file: demo3.cbl, line: 10) 
      Modifier : PTRNUM-G (file: demo3.cbl, def: 5) 
      Pointer : MEM-PTR a formal parm 
                (file: demoproto.cpy, def: 17, ref: 29, no: 1) 
              in CALL prototype of CBL_FREE_MEM 
                (file: demoproto.cpy, def:28) 
              as implicitly def'd by CALL at (file: demo3.cbl, line: 10) 
    
    **Possible unsafe modification of 'BY VALUE' pointer parameter 
    **in CALL 'CBL_FREE_MEM' statement at (file: demo3.cbl, line: 13) 
      Modifier : PTRNUM-G (file: demo3.cbl, def: 5)
      Pointer : MEM-PTR a formal parm 
                (file: demoproto.cpy, def: 17, ref: 29, no: 1)
              in CALL prototype of CBL_FREE_MEM 
                (file: demoproto.cpy, def:28) 
              as implicitly def'd by CALL at (file: demo3.cbl, line: 13)
    
    **Unsafe modification of pointer at (file: demo3.cbl, line: 17)
      Modifier : PTRNUM (file: demo3.cbl, def: 6) 
      Pointer : MEM-DUMMY-PTR
                (file: demoproto.cpy, def: 19) 
              of formal parm MEM-DUMMY-PTR-G
                (file: demoproto.cpy, def: 18, ref: 32, no: 1)
              in CALL prototype of CBL_DUMMY_ALLOC_MEM 
                (file: demoproto.cpy, def:31)
              as implicitly def'd by CALL at (file: demo3.cbl, line: 15) 
    
    Finished file 'demo3.int' - pointer problems could exist 
    このレポートには 2 種類の警告が含まれています。
    • 行 10 と行 13 では、CBL_ALLOC_MEM と CBL_FREE_MEM の呼び出しは直接的にポインタを予期しますが、代わりにそれらの呼び出しは pic x(4) として定義されるデータ項目を含んでいるグループ項目を受け取ります。これは正規のパラメータ・ポインタ MEM-PTR を英数字データ項目として再定義し、ソース・コードの問題となります。ポインタが API によって予期される場合は、ポインタを指定する必要があります。
    • 行 17 では、問題がさらに複雑ですが、その理由は上記とほぼ同じです。レポートされる問題は行 15 の CBL_DUMMY_ALLOC_MEM の呼び出しから生じており、このルーチンはポインタを含んでいるグループ項目を予期します。しかし、呼び出しプログラムは pic x(4) として定義されるデータ項目を含んでいるグループ項目を渡します。グループ定義とそれら内部での再定義の複雑な性質によって、これは直接レポートされません。代わりに Scan64 は、黙示的なポインタ定義をプログラム内のそのデータ位置 (呼び出しプロトタイプが予期していたポイントの定義位置) で作成します。この暗黙的に定義されるポインタによって占有されるメモリ上の操作でポインタの使用方法と一致しないものには、要注意の対象としてフラグが設定されます。さらに行 17 の文は、暗黙的に定義されたポインタにより占有されるメモリ位置の無効な変更となります。