[英]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.