簡體   English   中英

由於使用 SSE 指令的未對齊 memory 訪問導致的一般保護異常

[英]General Protection Exception due to unaligned memory access with SSE instructions

有一個大小為 68 字節的 C 結構,它作為參數傳遞給另一個 function 說 Temp。

#pragma pack(1)
struct A {
    char [68];
};
#pragma pack()


void Temp(struct A)
{
/*
    some code goes here
*/
}

int main()
{
        struct A var1;

        Temp(var1); //-> SSE instructions are generated for this call (MOVAPS ...)

        return 0;
}

在反匯編代碼中(不是上面的代碼,只說明了場景),我們看到在 function 調用(Temp)之前使用了 SSE(MOVAPS)指令。 這些指令的 memory 操作數似乎未對齊,這會觸發一般保護異常。 使用的優化級別是/O1b2s。 請注意,禁用優化后不會出現此問題。 源代碼最初是使用 Visual Studio 2008 編譯的,但未觀察到此問題。 編譯器升級到 Visual Studio 2017 並發布開始浮出水面。

我們現在的解決方法是 1. 使用 /Ob2 作為編譯器優化級別 2. 使用 #pragma optimize(off) 和 #pragma optimize(on)

這兩種解決方法都有影響。 對於第一個解決方法,代碼大小顯着增加,但存在大小限制。 我們仍在評估第二種解決方法的后果。

代碼的scope是在UEFI環境下的。

任何避免這種情況的建議將不勝感激。

這聽起來像一個編譯器錯誤。 但是我無法使用 Visual Studio 2019 (16.3.9) 重現此問題

這是我使用的代碼:

#include <stdio.h>

#pragma pack(1)
struct A {
    char field[68];
};
#pragma pack()


__declspec(noinline) void Temp(struct A a)
{
    if (a.field[3] != 0)
    {
        printf("hello world\n");
    }
}

int main()
{
    struct A var1 = {0};

    Temp(var1); //-> SSE instructions are generated for this call (MOVAPS ...)

    return 0;
}

生成的程序集是

Temp(var1); //-> SSE instructions are generated for this call (MOVAPS ...)
00007FF710D510A4  movaps      xmmword ptr [rbp+7],xmm0  
00007FF710D510A8  movaps      xmm0,xmmword ptr [rbp-29h]  
00007FF710D510AC  movaps      xmmword ptr [rbp+17h],xmm1  
00007FF710D510B0  movaps      xmm1,xmmword ptr [rbp-19h]  
00007FF710D510B4  movaps      xmmword ptr [rbp+27h],xmm0  
00007FF710D510B8  movaps      xmmword ptr [rbp+37h],xmm1  
00007FF710D510BC  mov         dword ptr [rbp+47h],eax  
00007FF710D510BF  call        Temp (07FF710D5105Ch)

我數了 4 MOVAPS 和 1 MOV DWORD。 這似乎與您指定的 68 字節大小相匹配。

如果這是已在 VS2019 中修復的 VS2017 中的錯誤,那么我建議您轉移到新的編譯器。 特別是它與 VS2017 兼容的 ABI。 試試看?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM