Partager via


Avertissement du compilateur C5045

Le compilateur insère l’atténuation de Spectre pour la charge de mémoire si le commutateur /Qspectre spécifié

Notes

L’avertissement C5045 vous permet de voir quels modèles dans votre code provoquent une atténuation spectre, telle qu’une LFENCE, à insérer lorsque l’option du compilateur /Qspectre est spécifiée. Cela vous permet d’identifier les fichiers de code affectés par le problème de sécurité. Cet avertissement est purement informatif : l’atténuation n’est pas insérée tant que vous n’avez pas recompilé à l’aide du commutateur /Qspectre . La fonctionnalité de C5045 est indépendante du commutateur /Qspectre . Vous pouvez donc les utiliser dans la même compilation.

Cet avertissement est nouveau dans Visual Studio 2017 version 15.7 et est désactivé par défaut. Utilisez /Wall pour activer tous les avertissements désactivés par défaut ou /wn5045 pour activer C5045 en tant qu’avertissement n de niveau. Dans l’IDE, le niveau d’avertissement par défaut est /W3 et cet avertissement peut être activé dans la boîte de dialogue Pages de propriétés du projet. Ouvrez la ligne de commande C/C++>Propriétés>de configuration et, dans la zone Options supplémentaires, ajoutez /w35045, puis choisissez OK. Pour plus d’informations, consultez les avertissements du compilateur désactivés par défaut. Pour plus d’informations sur la désactivation des avertissements par version du compilateur, consultez avertissements du compilateur par version du compilateur.

Exemple

L’exemple suivant déclenche l’avertissement C5045 lors de la compilation par Visual Studio 2017 version 15.7 avec / Wall ou les options /w35045 et /W3 :

// C5045.cpp
// Compile with: cl /EHsc /W3 /w35045 C5045.cpp

int G, G1, G2;

__forceinline
int * bar(int **p, int i)
{
    return p[i];
}

__forceinline
void bar1(int ** p, int i)
{
    if (i < G1) {
        auto x = p[i]; // C5045: mitigation here
        G = *x;
    }
}

__forceinline
void foo(int * p)
{
    G = *p;
}

void baz(int ** p, int i)
{
    if (i < G1) {
        foo(bar(p, i + G2));
    }
    bar1(p, i);
}

int main() { }

La sortie du compilateur lorsque l’avertissement est activé ressemble à ceci :

C:\Users\username\source\repos\C5045>cl /W3 /w35045 C5045.cpp
Microsoft (R) C/C++ Optimizing Compiler Version 19.14.26431 for x86
Copyright (C) Microsoft Corporation.  All rights reserved.

C5045.cpp
c:\users\username\source\repos\c5045\c5045.cpp(16) : warning C5045: Compiler will insert Spectre mitigation for memory load if /Qspectre switch specified
c:\users\username\source\repos\c5045\c5045.cpp(15) : note: index 'i' range checked by comparison on this line
c:\users\username\source\repos\c5045\c5045.cpp(17) : note: feeds memory load on this line
Microsoft (R) Incremental Linker Version 14.14.26431.0
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:C5045.exe
C5045.obj

Les messages d’avertissement montrent qu’une atténuation aurait été insérée à la ligne 16. Il note également que l’atténuation est nécessaire, car l’index i sur la ligne 15 alimente la charge mémoire sur la ligne 17. La spéculation est effectuée sur la barre et la barre1, mais l’atténuation est efficace lorsqu’elle est placée à la ligne 16.

Voir aussi

Guide pour les développeurs de C++ sur les canaux auxiliaires d’exécution spéculative
/Qspectre
spectre