Aracılığıyla paylaş


Derleyici Hatası C7553

satır içi assembler bir lambda'da desteklenmiyor

Açıklamalar

Visual Studio'nun Visual Studio 2017 sürüm 15.9'un önceki sürümlerinde, bir lambda içinde satır içi assembler kullanımı çalışma zamanında bozulmaya ebp (dönüş adresi kaydı) yol açabilir. Kötü amaçlı bir saldırgan bu senaryodan yararlanabilir. Satır içi derleyici yalnızca x86'da desteklenir ve satır içi derleyici ile derleyicinin geri kalanı arasındaki etkileşim zayıftır. Bu olgular ve sorunun doğası göz önünde bulundurulduğunda, bu sorunun en güvenli çözümü bir lambda ifadesi içinde satır içi derleyiciye izin vermekti.

'Vahşi doğada' bulduğumuz bir lambda ifadesi içinde satır içi assembler'ın tek kullanımı dönüş adresini yakalamaktı. Bu senaryoda, yalnızca bir derleyici iç kullanarak tüm platformlarda _ReturnAddress()dönüş adresini yakalayabilirsiniz.

Derleyici Hatası C7553, Visual Studio 2017 sürüm 15.9'dan başlayarak Visual Studio'da oluşur.

Örnek

Aşağıdaki kod, Visual Studio 2017 15.9 ve sonraki sürümlerde C7553 üretir:

#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;
}

Hatadan kaçınmak için, derleme kodunu aşağıdaki örnekte gösterildiği gibi adlandırılmış bir işleve taşıyın:

#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());
}