컴파일러 오류 C7553
인라인 어셈블러는 람다에서 지원되지 않습니다.
설명
Visual Studio 2017 버전 15.9 이전 버전의 Visual Studio에서는 람다 내에서 인라인 어셈블러를 사용하면 런타임에 (반환 주소 레지스터)가 ebp
손상될 수 있습니다. 악의적인 공격자가 이 시나리오를 활용할 수 있었습니다. 인라인 어셈블러는 x86에서만 지원되며, 인라인 어셈블러와 컴파일러 나머지 부분 간의 상호 작용은 좋지 않습니다. 이러한 사실과 문제의 특성을 감안할 때 이 문제의 가장 안전한 해결책은 람다 식 내에서 인라인 어셈블러를 허용하지 않는 것입니다.
발견된 ‘실제’ 사례에서 인라인 어셈블러가 람다 식 내에서 사용되는 유일한 목적은 반환 주소를 캡처하기 위한 것이었습니다. 이 시나리오에서는 컴파일러 고유의 _ReturnAddress()
를 사용하여 모든 플랫폼에서 반환 주소를 캡처할 수 있습니다.
컴파일러 오류 C7553은 Visual Studio 2017 버전 15.9부터 Visual Studio에서 발생합니다.
예시
다음 코드는 Visual Studio 2017 15.9 이상 버전에서 C7553을 생성합니다.
#include <cstdio>
int f()
{
int y = 1724;
int x = 0xdeadbeef;
auto lambda = [&]
{
__asm { // C7553: inline assembler is not supported in a lambda
mov eax, x
mov y, eax
}
};
lambda();
return y;
}
오류를 방지하려면 다음 예제와 같이 어셈블리 코드를 명명된 함수로 이동합니다.
#include <cstdio>
void g(int& x, int& y)
{
__asm {
mov eax, x
mov y, eax
}
}
int f()
{
int y = 1724;
int x = 0xdeadbeef;
auto lambda = [&]
{
g(x, y);
};
lambda();
return y;
}
int main()
{
std::printf("%d\n", f());
}