performance-no-int-to-ptr

诊断所有整数到指针的转换。

将(整型)指针转换为整数很明显——你只会得到指针的整数值,而将整数转换为(整型)指针却有所不同。虽然你会得到一个具有该整数值的指针,但如果你是通过指针到整数的转换获得的该整数值,那么新指针将缺少原始指针的来源信息。

所以,虽然(整型)指针到整数的转换实际上是无操作的,并且对优化器是透明的,但整数到(整型)指针的转换却不是透明的,并且可能会隐藏优化器的信息。

虽然这可能是你的意图,但并非总是如此。例如,让我们来看看一个将指针对齐到 16 的倍数的例程:对于此例程,最明显的朴素实现是

char* src(char* maybe_underbiased_ptr) {
  uintptr_t maybe_underbiased_intptr = (uintptr_t)maybe_underbiased_ptr;
  uintptr_t aligned_biased_intptr = maybe_underbiased_intptr + 15;
  uintptr_t aligned_intptr = aligned_biased_intptr & (~15);
  return (char*)aligned_intptr; // warning: avoid integer to pointer casts [performance-no-int-to-ptr]
}

该检查会正确地诊断该转换。

但当隐藏来源不是代码的目标,而是一个意外时,这个例子可以改写如下,而不使用整数到指针的转换

char*
tgt(char* maybe_underbiased_ptr) {
    uintptr_t maybe_underbiased_intptr = (uintptr_t)maybe_underbiased_ptr;
    uintptr_t aligned_biased_intptr = maybe_underbiased_intptr + 15;
    uintptr_t aligned_intptr = aligned_biased_intptr & (~15);
    uintptr_t bias = aligned_intptr - maybe_underbiased_intptr;
    return maybe_underbiased_ptr + bias;
}