Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
asembler wbudowany nie jest obsługiwany w a lambda
Uwagi
W wersjach programu Visual Studio przed programem Visual Studio 2017 w wersji 15.9 użycie wbudowanego asemblera w środowisku lambda może prowadzić do uszkodzenia (rejestru adresów zwrotnych ebp ) w czasie wykonywania. Złośliwy atakujący może skorzystać z tego scenariusza. Wbudowany asembler jest obsługiwany tylko w architekturze x86, a interakcja między wbudowanym asemblerem a resztą kompilatora jest słaba. Biorąc pod uwagę te fakty i charakter problemu, najbezpieczniejszym rozwiązaniem tego problemu było uniemożliwienie asemblera wbudowanego w wyrażeniu lambda.
Jedynym użyciem wbudowanego asemblera w wyrażeniu lambda, które znaleźliśmy "na wolności", było przechwycenie adresu zwrotnego. W tym scenariuszu można przechwycić adres zwrotny na wszystkich platformach, używając wbudowanego kompilatora _ReturnAddress().
Błąd kompilatora C7553 występuje w programie Visual Studio, począwszy od programu Visual Studio 2017 w wersji 15.9.
Przykład
Poniższy kod generuje kod C7553 w programie Visual Studio 2017 w wersji 15.9 lub nowszej:
#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;
}
Aby uniknąć błędu, przenieś kod zestawu do nazwanej funkcji, jak pokazano w poniższym przykładzie:
#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());
}