我有一个项目具有严格的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附带)在本地存储环境变量。你可以用它来代替。