c++ getenv(环境变量)中字符串的线程安全初始化

ix0qys7i  于 2022-11-19  发布在  其他
关注(0)|答案(1)|浏览(131)

我有一个项目与紧凑级的叮当整齐的静态分析。
为了检查环境中的一些一致性,我正在探查一些环境变量的值。

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。

wgx48brx

wgx48brx1#

这可能是一个过时的警告或与C的getenv混淆,后者根本不是线程安全的。
getenv_s(C11附带的)在本地存储环境变量。

相关问题