Partager via


Erreur du compilateur C7553

l’assembleur inline n’est pas pris en charge dans une expression lambda

Notes

Dans les versions de Visual Studio antérieures à Visual Studio 2017 version 15.9, l’utilisation de l’assembleur inline au sein d’une lambda peut entraîner l’altération (le registre d’adresses de retour) au moment de ebp l’exécution. Une personne malveillante pouvait éventuellement tirer parti de ce scénario. L’assembleur inline n’est pris en charge que sur x86, et l’interaction entre l’assembleur inline et le reste du compilateur est médiocre. Compte tenu de cela et de la nature du problème, la solution la plus sûre à ce problème était de interdire l’assembleur inline dans une expression lambda.

La seule utilisation de l’assembleur inline dans une expression lambda que nous avons rencontrée avait pour but de capturer l’adresse de retour. Dans ce scénario, vous pouvez capturer l’adresse de retour sur toutes les plateformes simplement à l’aide de _ReturnAddress() intrinsèque au compilateur.

L’erreur du compilateur C7553 se produit dans Visual Studio à partir de Visual Studio 2017 version 15.9.

Exemple

Le code suivant produit C7553 dans Visual Studio 2017 15.9 et versions ultérieures :

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

Pour éviter cette erreur, déplacez le code d’assembly dans une fonction nommée comme indiqué dans l’exemple suivant :

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