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



我有一个项目具有严格的clang整洁静态分析级别。

为了检查环境中的一些一致性,我正在探究一些环境变量的值。

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,它说函数是线程安全的,因为C++11(我使用的是C++17)。但也许这个警告是指环境变量本身可能在幕后发生变化。

其次,即使这在某种意义上不是线程安全的:我能做些什么?是否存在使用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。

这可能是一个过时的警告,或者与C的getenv混淆,后者根本不是线程安全的。

getenv_s(C11附带)在本地存储环境变量。你可以用它来代替。

最新更新