다음을 통해 공유


컴파일러 경고 C5045

컴파일러는 /Qspectre 스위치가 지정된 경우 메모리 로드를 위해 Spectre 완화를 삽입합니다.

설명

경고 C5045를 사용하면 /Qspectre 컴파일러 옵션을 지정할 때 LFENCE와 같은 Spectre 완화가 삽입되는 코드의 패턴을 확인할 수 있습니다. 이렇게 하면 보안 문제의 영향을 받는 코드 파일을 식별할 수 있습니다. 이 경고는 전적으로 정보 제공입니다. /Qspectre 스위치를 사용하여 다시 컴파일할 때까지 완화가 삽입되지 않습니다. C5045의 기능은 /Qspectre 스위치와 독립적이므로 동일한 컴파일에서 둘 다 사용할 수 있습니다.

이 경고는 Visual Studio 2017 버전 15.7의 새로운 기능이며 기본적으로 해제되어 있습니다. /Wall을 사용하여 기본적으로 해제된 모든 경고를 사용하거나 /wn5045를 사용하여 C5045를 수준 n 경고로 사용하도록 설정합니다. IDE에서 기본 경고 수준은 /W3이며 프로젝트 속성 페이지 대화 상자에서 이 경고를 사용하도록 설정할 수 있습니다. 구성 속성>C/C++>명령줄을 열고 추가 옵션 상자에서 /w35045를 추가한 다음 확인을 선택합니다. 자세한 내용은 기본적으로 꺼져 있는 컴파일러 경고를 참조하세요. 컴파일러 버전별 경고를 사용하지 않도록 설정하는 방법에 대한 자세한 내용은 컴파일러 버전별 컴파일러 경고를 참조하세요.

예시

다음 예제에서는 /Wall 또는 /w35045 및 /W3 옵션을 사용하여 Visual Studio 2017 버전 15.7에서 컴파일할 때 경고 C5045를 발생합니다.

// 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() { }

경고를 사용할 때 컴파일러 출력은 다음과 같습니다.

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

경고 메시지는 완화가 줄 16에 삽입되었음을 보여줍니다. 또한 줄 15의 인덱스 i가 줄 17의 메모리 부하를 공급하기 때문에 완화가 필요하다고 지적합니다. 추측은 가로 막대 및 bar1에서 수행되지만 16줄에 배치하면 완화가 효과적입니다.

참고 항목

Speculative Execution Side Channels에 대한 C++ 개발자 지침
/Qspectre
spectre