Tenho um código legado que se lê assim:
bool has_attribute(int kvidx) const {
void* v = nullptr;
int flag = 0;
MPI_Comm_get_attr(impl_, kvidx, &v, &flag);
return flag != 0;
}
O terceiro argumento de MPI_Comm_get_attr
pega um .void**
CORREÇÃO: … pega void*
, mas é void**
semanticamente de acordo com a documentação da função. Esta é a verdadeira origem do aviso.
Este código agora está emitindo um aviso sonoro bugprone-multi-level-implicit-pointer-conversion
.
Clang-tidy recomenda: "conversão de ponteiro multinível de 'char **' para 'void *', use conversão explícita"
Como aplico esse "elenco explícito"?
Eu tentei, MPI_Comm_get_attr(impl_, kvidx, static_cast<void**>(&v), &flag);
mas o clang continua reclamando.
Para esclarecer, o código está correto AFAIK, estou tentando seguir a recomendação do clang-tidy (sem suprimir o aviso)
Clang-tidy está correto do seu ponto de vista.
O problema surge do comportamento da API.
De acordo com a
MPI_Comm_get_attr
documentação , esta é a assinatura da função:O terceiro parâmetro é um
void*
, não umvoid**
, então o Clang-tidy detectou corretamente que uma conversão multinível é necessária.No entanto, a
MPI_Comm_get_attr
documentação também afirma que:Então você estava certo em passar
&v
como argumento.A única solução que vejo é suprimir o Clang-tidy para esta parte do código.