我有一个项目与紧凑级的叮当整齐的静态分析。
为了检查环境中的一些一致性,我正在探查一些环境变量的值。
int main() {
char const* ompi_size_cstr = std::getenv("OMPI_COMM_WORLD_SIZE");
...
}
(不考虑变量的含义)。
但现在我得到这个警告:
/builds/user/mpi3/environment.hpp:49:51: error: function is not thread safe [concurrency-mt-unsafe,-warnings-as-errors]
const char* ompi_size_cstr = std::getenv("OMPI_COMM_WORLD_SIZE");
首先,如果我看一下文档https://en.cppreference.com/w/cpp/utility/program/getenv,它说 function 从C11(我使用的是C17)开始就是线程安全的。
第二,即使在某种意义上这不是线程安全的:我能做些什么呢?是否有使用getenv
的规范解决方案?,
例如,通过锁定手动引入的get_env_mtx
互斥锁,或者使我的变量声明为static
,
static const char* ompi_size_cstr = std::getenv("OMPI_COMM_WORLD_SIZE");
或
static std::string ompi_size_cstr = std::getenv("OMPI_COMM_WORLD_SIZE");
当然,我也可以引入一个例外,// NOLINT(concurrency-mt-unsafe)
,但我想知道是否有一个修复,我可以表达为更好的代码代替。这也是很好的改善代码,即使在最后我不得不添加一个NOLINT
。
注意:我使用的是clang-tidy
版本14.0.6
,并且是C++17。
1条答案
按热度按时间wgx48brx1#
这可能是一个过时的警告或与C的
getenv
混淆,后者根本不是线程安全的。getenv_s
(C11附带的)在本地存储环境变量。