アーティクル - CS258897

ObjectAda によって、ビットフィールド記録を保存するための無効なコードが生成されることがあります。

修正日: 18-Mar-2017   


注記:ここに記載されている情報は、お客様の利便性向上のため機械翻訳ソフトを使用しています。PTCは、ここに記載されている情報の翻訳の正確性について、一切の責任を負いませんので、ご了承ください。英語の原文を参照するには、こちら。この機械翻訳に関する詳細は、こちら。
お知らせいただき、ありがとうございます。この機械翻訳をレビューします。

適用対象

  • ObjectAda 9.2

説明

  • 実行可能ファイルの列挙タイプの値が間違っています
  • 記録構成部品の値が間違っています
  • 場合によっては、ObjectAda によって間違った命令が生成されることがあります。
    • メモリの複数バイトを占有する16ビット未満の構成部品を記録します。
    • データ型が列挙型の場合、最も頻繁に問題が発生すると思われます。
  • 問題を公開するソースコードの例を次に示します。
  • package bug_pkg is
       type T1 is (e1,e2,e3,e4,e5);
       type rec is record
          b : boolean;
          z : T1;
       end record;
       for rec use record
          b at 0 range 0..5;
          z at 0 range 6..8;
       end record;
    
       type ptr is access all T1;
    
       procedure test (r : in out rec; p : ptr; b : boolean);
    end;
    
    package body bug_pkg is
       procedure test (r : in out rec; p : ptr; b : boolean) is
       begin
          r := (b,p.all);
       end;
    end;
  • 上記のソースコードのコンパイル時に生成された不適切なコード:
  • The code generated to store the record component r.z is as follows:
             MOV    BH, [EAX+0]   <--------------- Value loaded into BH
             CMP    BH, 4
             JA     SHORT L7
    
             SHL    BX, 6     <--  Incorrectly assumes value was loaded into BL
             AND    BX, 448
             AND    WORD PTR [EBP-4], 65087
    
             OR     [EBP-4], BX ;  DY4
             MOV    EBX, [EBP+8] ;  r
             MOV    CX, [EBP-4] ;  DY4
             MOV    [EBX+0], CX

最新バージョンはこちらを参照ください CS258897