相关疑难解决方法(0)

接近恒定时间旋转,不违反标准

我有一段时间试图提出一个不违反C/C++标准的恒定时间旋转.

问题是边缘/角落情况,其中操作在算法中被调出并且那些算法不能被改变.例如,以下内容来自Crypto ++并执行GCC ubsan(即g++ fsanitize=undefined)下的测试工具:

$ ./cryptest.exe v | grep runtime
misc.h:637:22: runtime error: shift exponent 32 is too large for 32-bit type 'unsigned int'
misc.h:643:22: runtime error: shift exponent 32 is too large for 32-bit type 'unsigned int'
misc.h:625:22: runtime error: shift exponent 32 is too large for 32-bit type 'unsigned int'
misc.h:637:22: runtime error: shift exponent 32 is too large for 32-bit type 'unsigned int'
misc.h:643:22: runtime error: shift exponent 32 is …
Run Code Online (Sandbox Code Playgroud)

c++ bitwise-operators undefined-behavior constant-time

25
推荐指数
2
解决办法
4679
查看次数

clang(LLVM)内联汇编 - 无限溢出/重载的多个约束

clang/gcc:一些内联汇编操作数可以满足多个约束,例如"rm",当操作数可以满足寄存器或存储器位置时.例如,64 x 64 = 128位乘法:

__asm__ ("mulq %q3" : "=a" (rl), "=d" (rh) : "%0" (x), "rm" (y) : "cc")
Run Code Online (Sandbox Code Playgroud)

生成的代码似乎为参数选择了一个内存约束3,如果我们注册了饥饿就可以了,以避免溢出.显然,x86-64的注册压力要小于IA32.但是,(通过clang)生成的程序集片段是:

    movq    %rcx, -8(%rbp)
    ## InlineAsm Start
    mulq -8(%rbp)
    ## InlineAsm End
Run Code Online (Sandbox Code Playgroud)

选择内存约束显然毫无意义!将约束更改为:"r" (y)但是(强制注册)我们得到:

    ## InlineAsm Start
    mulq %rcx
    ## InlineAsm End
Run Code Online (Sandbox Code Playgroud)

正如所料.这些结果适用于clang/LLVM 3.2(当前Xcode版本).第一个问题:为什么clang会在这种情况下选择效率较低的约束?

其次,有较少广泛使用的,用逗号分隔,多个替代约束语法:
"r,m" (y),这应该评估各方案的成本,并选择导致较少拷贝的一个.这似乎有效,但是clang只选择了第一个 - 如下所示:"m,r" (y)


我可以简单地删除"m"替代约束,但这并不表示可能的合法操作数的范围.这让我想到第二个问题:这些问题是否已在3.3中得到解决或至少得到承认?我试过查看LLVM开发档案,但我宁愿在不必要地进一步限制约束或加入项目讨论等之前征求一些答案.

assembly gcc x86-64 clang inline-assembly

12
推荐指数
1
解决办法
6072
查看次数