This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] 编译器:由&gt 移位时、UINT64_t 截断;32个位置

Guru**** 2573695 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/677319/compiler-uint64_t-truncation-when-shifting-by-32-positions

工具/软件:TI C/C++编译器

在-OS 模式下使用 TI 编译器16.9.6进行编译时 、mbedTLS SHA-512实现 会产生错误的结果。

下面的测试代码是错误行为的摘录、特别是看起来64位移位超过32个位置的操作不正确。

#define GET_UINT64_BE (n、b、i)
\{ \
(n)=((uint64_t)(b)[(i)]<< 56) \
|(uint64_t)(b)[(i)+1]<< 48) \
|(uint64_t)(b)[(i)+ 2]<< 40) \
|(uint64_t)(b)[(i)+3]<< 32) \
|(uint64_t)(b)[(i)+ 4]<< 24) \
|(uint64_t)(b)[(i)+ 5]<< 16) \
|(uint64_t)(b)[(i)+6]<< 8) \
|((uint64_t)(b)[(i)+ 7] ); \
}

静态 void test64 (void){
uint64_t w[2]={0、0};
int i;
静态常量 uint8_t TD[16]={
0x00、0x01、0x02、0x03、0x04、 0x05、0x06、0x07、
0x08、0x09、0x0a、0x0B、0x0c、 0x0D、0x0E、0x0F
};
对于(i = 0;i < 2;i++){
get_UINT64_BE (w[i]、td、I << 3);
}
对于(i = 0;i < sizeof (w);i++){
printf ("%02x "、((uint8_t *) w)[i]);
}
printf ("\n");
}

运行时、它会产生以下输出:

07 06 05 05 04 03 00 00 0f 0e 0d 0c 0b 00 00

请注意、uint64_ts 中的前3个字节为零、因此看起来像在上面的|运算符中移位40、48和56会导致0。

这是编译器生成的汇编器代码:

0103叶4 :
103eaf4: b5f0 按{R4、R5、R6、r7、LR}
103eaf6: 2100 MOV R1、#0
103eaf8: 2210. MOV R2、#16
103eafa: f1ad 0d14 sub.w sp、#20
103eafe: 4668 MOV r0、sp
103eb00: f005 fc3e. BL 1044380 
103eb04: 4c24. LDR R4,[PC,#144];(103eb98 )
103eb06: 466 d MOV R5、sp
103eb08: 2300 MOV R3、#0
103eb0a: 2702 MOV r7、#2
103eb0c: 78e6. ldrb R6、[R4、#3]
103eb0e: 78a0 ldrb r0、[R4、#2]
103eb10: 17F1 ASRS R1、R6、#31
103eb12: 4318 r0、r3
103eb14: 0202. lls R2、r0、#8
103eb16: e46 0003 ORR.w r0、R6、R3
103eb1a: 4311. 电阻器 R1、R2
103eb1c: 0e02 LSR R2、r0、#24
103eb1e: 0206 Lls R6、r0、#8
103eb20: 7920. ldrb r0、[R4、#4]
103eb22: 0209 Lls R1、R1、#8
103eb24: 4311. ORRs R1、R2
103eb26: 17c2. ASRS R2、r0、#31
103eb28: 430A 电阻器 R2、R1
103eb2a: 4330 R0、R6
103eb2c: 0211. Lls R1、R2、#8
103eb2e: 0206 Lls R6、r0、#8
103eb30: 0e02 LSR R2、r0、#24
103eb32: 7960 ldrb r0、[R4、#5]
103eb34: 4311. ORRs R1、R2
103eb36: 17c2. ASRS R2、r0、#31
103eb38: 430A R2/R1
103eb3a: 4330 r0、r6
103eb3c: 0211. Lls R1、R2、#8
103eb3e: 0206 Lls R6、r0、#8
103eb40: 0e02 LSR R2、r0、#24
103eb42: 79a0 ldrb r0、[R4、#6]
103eb44: 4311. Rr R1、R2
103eb46: 17c2. ASRS R2、r0、#31
103eb48: 430A R2/R1
103eb4a: 4330 R0、R6
103eb4c: 0211. Lls R1、R2、#8
103eb4e: 0206 Lls R6、r0、#8
103eb50: 0e02 LSR R2、r0、#24
103eb52: 79e0 ldrb r0、[R4、#7]
103eb54: 1e7f subs r7、r7、#1
103eb56: ea41 0102 ORR.w R1、R1、R2
103eb5a: e4f 72e0 MOV.w R2、r0、ASR #31
103eb5e: f104 0408 ADD.W R4、R4、#8
103eb62: ea42 0101 ORR.w R1、R2、R1
103eb66: ea40 0006 ORr.w r0、r0、r6
103eb6a: c503. stmia R5!、{r0、r1}
103eb6c: D1ce BNE.n 103eb0c 
103eb6e: 2410. MOV R4、#16
103eb70: 466 d MOV R5、sp
103eb72: f815 1b01 ldrb.w R1、[R5]、#1
103eb76: A005. 添加 R0、PC、#20 ;(Adr r0、103eb8c )
103eb78: f006 ffd0 BL 1045b1c 
103eb7c: 1e64 SUS R4、R4、#1
103eb7e: d1f8. BNE.n 103eb72 
103eb80: A004. 添加 R0、PC、#16 ;(ADR r0、103eb94 )
103eb82: f006 ffcb BL 1045b1c 
103eb86: B005 添加 SP、#20
103eb88: bdf0 弹出 {R4、R5、R6、r7、PC}
103eb8a: 46c0 NOP ;(mov R8、R8)
103eb8c: 78323025 .word 0x78323025
103eb90: 46c00020 .word 0x46c00020
103eb94: 46c0000a .word 0x46c0000a
103eb98: 01059282 字0x01059282

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    FWiw、正在使用的完整 CFLAGS:

    CFLAGS ?=-mv7M4 --little_endian --code_state=16 --float_support=vfplib --abi=eabi \
    -O4 -opt_for_speed=0 --unaligned_access=on --small_enum \
    --gen_func_subsections=on -i$(TI_Compiler_path)/include
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您将问题通知我们、并提交一份简明的测试案例。  我可以重现相同的行为。  我在 SDOWP 系统中提交了 CodeGen-4638、以对其进行调查。  欢迎您在我的签名中使用下面的 SDOWP 链接进行访问。

    谢谢、此致、

    乔治

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢 George! 很高兴听到这个消息。
    但是、您能提供一个链接吗? 我在系统中找不到它。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    新问题在系统中传播需要几个小时。  请耐心等待。

    谢谢、此致、

    乔治