我有一个来自这里的代码片段:
volatile int volatileInt;
int usualInt;
void function (unsigned x, unsigned y, unsigned z)
{
volatileInt = 0;
usualInt = (x % y) / z;
}
int main()
{
function(rand(), rand(), rand());
}
我用 Visual C++ 10 编译/O2
并得到这个反汇编:
00403940 push ebx
00403941 push esi
276: function(rand(), rand(), rand());
00403942 mov esi,dword ptr [__imp__rand (4050C0h)]
00403948 push edi
00403949 call esi
0040394B mov edi,eax
0040394D call esi
0040394F mov ebx,eax
00403951 call esi
00403953 xor edx,edx
00403955 div eax,ebx <<<< possible UB
00403957 mov dword ptr [volatileInt (4074D0h)],0
00403961 mov eax,edx
00403963 xor edx,edx
00403965 div eax,edi <<<< possible UB
00403967 pop edi
00403968 pop esi
00403969 pop ebx
0040396A mov dword ptr [usualInt (4074CCh)],eax
277: return 0;
0040396F xor eax,eax
00403971 ret
请注意,如果它们的第二个操作数在运行时为零,则有两个操作 - “mod”和“div”可能会产生 UB。在发出的代码中,两者都使用操作码实现,这些div
操作码将触发结构化异常并使程序崩溃,第二个操作数为零。
第一个div
是在volatile int
变量修改之前,第二个是在volatile int
修改之后。
因此,如果x
为零,则程序在不修改的情况下崩溃,volatile int
但如果x
为非零且y
为零,则程序修改volatile int
然后崩溃。
因此,根据是否x
为零y
,程序将表现出不同的可观察行为。
是否允许将代码与可能的 UB 与影响可观察行为的代码交错?