技术文章 - CS258897

ObjectAda 有时会生成无效代码来存储位字段记录组件

已修改: 23-Jun-2022   


注意:本文已使用机器翻译软件翻译,以方便非英语客户阅读。但翻译内容可能包含语法错误或不准确之处。请注意, PTC对本文所含信息的翻译准确性及使用后果不承担任何责任。请在 此处 查看本文的英文原始版本以便参考。有关机器翻译的更多详情,请单击 此处
感谢您告诉我们。我们将尽快审阅此译文。

适用于

  • 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