技术文章 - CS258897
ObjectAda 有时会生成无效代码来存储位字段记录组件
已修改: 23-Jun-2022
适用于
- ObjectAda 9.2
说明
- 可执行文件中枚举类型的值错误
- 记录组件的值错误
- 在某些情况下,ObjectAda 会生成错误的指令:
- 记录少于 16 位且占用超过 1 字节内存的组件
- 如果数据类型是枚举类型,问题似乎最常发生
- 暴露问题的源代码示例:
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
这是文章 258897 的 PDF 版本,可能已过期。最新版本 CS258897