Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在cmake中启用Qspectre和控制流量保护开关_C++_C_Visual Studio_Cmake - Fatal编程技术网

C++ 在cmake中启用Qspectre和控制流量保护开关

C++ 在cmake中启用Qspectre和控制流量保护开关,c++,c,visual-studio,cmake,C++,C,Visual Studio,Cmake,我正在尝试在cmake中启用Qspectre和控制流防护(安全设置)。如何使用cmake文件在cmake中启用这些设置? 和选项都是Visual Studio 2017的安全开关。QSpectre“指定编译器生成指令以缓解某些Spectre variant 1安全漏洞”,Control Flow Guard“使编译器在编译时分析间接调用目标的控制流” 本质上,两者都是针对安全漏洞的编译器选项 目前,我正在尝试使用主CMAKE文件中的两个选项来实现: if (MSVC AND NOT MSVC_

我正在尝试在cmake中启用Qspectre和控制流防护(安全设置)。如何使用cmake文件在cmake中启用这些设置?

和选项都是Visual Studio 2017的安全开关。QSpectre“指定编译器生成指令以缓解某些Spectre variant 1安全漏洞”,Control Flow Guard“使编译器在编译时分析间接调用目标的控制流”

本质上,两者都是针对安全漏洞的编译器选项

目前,我正在尝试使用主CMAKE文件中的两个选项来实现:

if (MSVC AND  NOT MSVC_VERSION LESS 1900)
    if (${use_control_flow_guard}) 
        set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /guard:cf")
        SET(CMAKE_EXE_LINKER_FLAGS  "/guard:cf /DYNAMICBASE")
    endif()
    if (${use_qspectre})
        set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /Qspectre")
    endif()
endif()
此代码无法完成任务。从BinSkim(Microsoft二进制略读器)检查安全漏洞:

  • 控制流保护:

    错误BA2008:“***.dll”未启用控制流保护(CFG)缓解。要解决此问题,请在编译器和链接器命令行上传递/GUARD:CF。二进制文件还需要/DYNAMICBASE链接器选项才能启用CFG

  • Qspectre:

    以下模块是使用支持/Qspectre的工具集编译的,但未在命令行上启用该开关


对于启用控制流保护和Qspectre,上述方法在项目中基本上是正确的

if (MSVC AND (MSVC_VERSION GREATER 1900))
    if (${use_control_flow_guard})
        message("Setting CONTROL FLOW GUARD") 
        set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /guard:cf")
        SET(CMAKE_EXE_LINKER_FLAGS  "/guard:cf /DYNAMICBASE")
    endif()
    if (${use_qspectre})
        message("Setting QSPECTRE")
        set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /Qspectre")
    endif()
endif()
由于BinSkim正在分析
*.dll
文件,因此它还将检查
.dll
中的链接模块。因此,CFG和Qspectre标志可能是使用动态库设置和编译的,但是为项目链接的库可能不是使用控制流保护或Qspectre编译的库将产生问题并抛出错误


在这种情况下,如果链接的模块来自外部存储库,那么除了确认链接库中的漏洞并继续操作之外,您无能为力。

在哪里设置了
use\u control\u flow\u guard
变量?价值是多少?