|
1
4
在x86 asm中,最糟糕的情况是单个寄存器有一个未知值(或者您不知道它有两个可能的值中的哪一个,旧的还是新的,以防可能的内存顺序)。但是 if your code doesn't depend on that register value, you're fine 和C++不同的是。C++ UB意味着你的整个程序在理论上完全在一个有符号整数溢出之后被处理,甚至在此之前,编译器可以看到的代码路径将导致UB。在asm中从来没有发生过这样的事情,至少在没有特权的用户空间代码中没有。 (通过以奇怪的方式设置控制寄存器或将不一致的内容放入页表或描述符,您可以做一些事情来基本上导致内核中的系统范围内的不可预测行为,但这种情况不会发生,即使您正在编译内核代码。) 有些is a有“不可预测的行为”,比如早期ARM如果对乘法的多个操作数使用相同的寄存器,则行为是不可预测的。如果这允许中断管道和损坏其他寄存器,或者仅限于意外的乘法结果,则返回IDK。我猜是后者。 或者MIPS,如果将分支放在分支延迟槽中,则行为是不可预测的。(由于分支延迟时隙,处理异常非常混乱…)。但是,假设仍然有限制,您不能使机器崩溃或中断其他进程(在多用户系统(如Unix)中,如果没有特权的用户空间进程可以为其他用户中断任何内容,那将是糟糕的)。 早期的MIPS也有加载延迟时隙和乘法延迟时隙:不能在下一条指令中使用加载的结果。如果读得太早,可能会得到寄存器的旧值,或者可能只是垃圾。MIPS=Minimally Interlocked Pipeline Stages;他们希望将暂停卸载到软件中,但结果发现,当编译器找不到任何有用的东西来执行下一个臃肿的二进制文件时,添加NOP会导致整体代码变慢,而在必要时硬件暂停。但是我们会遇到分支延迟槽,因为移除它们会改变ISA,不像放松对软件早期没有做的事情的限制。 |
|
|
2
6
x86整数格式中没有陷阱值,因此读取和比较未初始化的值会生成不可预测的真/假值,并且不会产生其他直接危害。 在加密上下文中,导致采取不同分支的未初始化值的状态可能会泄漏到定时信息泄漏或其他侧通道攻击中。但是加密强化可能不是你所担心的。 gcc在不重要的时候进行未初始化的读取,如果读取的值不正确,并不意味着它会在重要的时候进行读取。 |
|
3
0
我不确定它是由编译器错误引起的。可能代码中有一些UB允许编译器优化更具攻击性的代码。不管怎样,对于这些问题:
|
|
|
111111 · 确定作为模板参数传递的函数的参数类型 1 年前 |
|
|
msg · std::variant的奇怪结果 1 年前 |
|
|
Mikhail T. · 如何将对象的方法传递给lambda函数? 1 年前 |
|
|
zack · 不接受变分模板函数参数 1 年前 |
|
|
Youssef Gamil · RegEx替换C中的空行++ 1 年前 |
|
|
GPrathap · 如何在C中返回智能指针和协方差++ 2 年前 |