如何在CMake中设置ASAN_OPTIONS环境变量?

6
据我所知,使用clang和ASAN_OPTIONS,必须在编译之前设置ASAN_OPTIONS环境变量。
在不添加包装脚本的情况下,在CMake脚本中如何实现此操作?
我需要仅在使用clang编译一个特定测试项目时禁用ODR违规检查。 因此,在CMakeLists.txt文件中,我有以下内容:
if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
  # Clange reports ODR Violation errors in mbedtls/library/certs.c.  Need to disable this check.
  set(ENV{ASAN_OPTIONS} detect_odr_violation=0)
endif()

但是在运行cmake之后,如果我输入echo $ASAN_OPTIONS,它并没有被设置。

在运行cmake之后,如果我输入:

export ASAN_OPTIONS=detect_odr_violation=0
make

一切都很好。

cmake是否可以设置环境变量,以便在cmake运行后仍然存在?抱歉,我对环境的理解有限!

3个回答

10
据我所知,在使用clang时,要使用ASAN_OPTIONS,必须在编译之前设置ASAN_OPTIONS环境变量。
实际上,ASAN_OPTIONS并不会以任何方式影响编译。相反,它控制编译后的代码行为,因此需要在运行测试之前设置(并导出)该变量。在您的情况下,使用另一种控制机制更加容易:__asan_default_options回调。请参考:__asan_default_options回调
#ifndef __has_feature
// GCC does not have __has_feature...
#define __has_feature(feature) 0
#endif

#if __has_feature(address_sanitizer) || defined(__SANITIZE_ADDRESS__)
#ifdef __cplusplus
extern "C"
#endif
const char *__asan_default_options() {
  // Clang reports ODR Violation errors in mbedtls/library/certs.c.
  // NEED TO REPORT THIS ISSUE
  return "detect_odr_violation=0";
}
#endif

好的,谢谢你澄清了这一点。我会尝试一下。 - Ashley Duncan

1
CMake是否可以设置环境变量,以便在CMake运行后保留该变量?
不可能。您无法从CMake中的父进程设置环境变量。即使是set命令的文档也对此进行了警告。
这里
此命令仅影响当前的CMake进程,而不影响调用CMake的进程、整个系统环境或随后的构建或测试进程的环境。

然而,您可能可以通过CMAKE_CXX_COMPILER_LAUNCHER变量解决这个特定问题:

set(CMAKE_CXX_COMPILER_LAUNCHER ${CMAKE_COMMAND} -E env ASAN_OPTIONS=detect_odr_violation=0 ${CMAKE_CXX_COMPILER_LAUNCHER})

这将使用相关的环境变量调用编译器。请在此处查看文档:https://cmake.org/cmake/help/latest/prop_tgt/LANG_COMPILER_LAUNCHER.html


感谢您对环境变量的解释。根据下面的答案,我实际上不想将此变量传递给编译器,而是需要在编译后的应用程序运行之前设置它,现在这有些合理了。 - Ashley Duncan

0

我发现,只是在shell中

export ASAN_OPTIONS=detect_container_overflow=0

我已经测试并成功了,不需要在cmake文件中设置。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接