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

制限事項: 本トピックは 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 の文は、暗黙的に定義されたポインターにより占有されるメモリ位置の無効な変更となります。