アーティクル - CS258897
ObjectAda によって、ビットフィールド記録を保存するための無効なコードが生成されることがあります。
修正日: 18-Mar-2017
適用対象
- 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