다음을 통해 공유


컴파일러 오류 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());
}