我有一些遗留代码,如下所示:
bool has_attribute(int kvidx) const {
void* v = nullptr;
int flag = 0;
MPI_Comm_get_attr(impl_, kvidx, &v, &flag);
return flag != 0;
}
的第三个参数MPI_Comm_get_attr
采用。void**
更正:... 它需要,但根据函数文档,void*
它在语义上是。这是警告的真正来源。void**
此代码现在发出 clang-tidy 警告bugprone-multi-level-implicit-pointer-conversion
。
Clang-tidy 建议:“从‘char **’到‘void *’的多级指针转换,请使用显式转换”
我该如何应用这种“显式转换”?
我尝试过,MPI_Comm_get_attr(impl_, kvidx, static_cast<void**>(&v), &flag);
但是 clang 仍然在抱怨。
需要明确的是,据我所知该代码是正确的,我正在尝试遵循 clang-tidy 的建议(不抑制警告)
从它的观点来看,Clang-tidy 是正确的。
该问题源于 API 的行为。
根据
MPI_Comm_get_attr
文档,这是该函数的签名:第三个参数是 a
void*
,而不是 avoid**
,因此 Clang-tidy 正确检测到需要进行多级转换。然而,
MPI_Comm_get_attr
文档还指出:因此,你提出的
&v
论点是正确的。我看到的唯一解决方案是抑制这部分代码的 Clang-tidy。