brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.2 KiB · 6817221 Raw
99 lines · cpp
1// RUN: %check_clang_tidy %s bugprone-casting-through-void %t2 3using V = void*;4using CV = const void*;5 6int i = 100;7double d = 100;8const int ci = 100;9const double cd = 100;10 11void normal_test() {12  static_cast<int *>(static_cast<void *>(&d));13  // CHECK-MESSAGES: :[[@LINE-1]]:22: warning: do not cast 'double *' to 'int *' through 'void *'; use reinterpret_cast instead [bugprone-casting-through-void]14  static_cast<int *>(static_cast<V>(&d));15  // CHECK-MESSAGES: :[[@LINE-1]]:22: warning: do not cast 'double *' to 'int *' through 'V' (aka 'void *'); use reinterpret_cast instead [bugprone-casting-through-void]16  static_cast<int *>(static_cast<void *>(&i));17  // CHECK-MESSAGES: :[[@LINE-1]]:22: warning: do not cast 'int *' to 'int *' through 'void *'; use reinterpret_cast instead [bugprone-casting-through-void]18 19  static_cast<void *>(static_cast<void *>(&i));20}21 22void const_pointer_test() {23  static_cast<int *const>(static_cast<void *>(&d));24  // CHECK-MESSAGES: :[[@LINE-1]]:27: warning: do not cast 'double *' to 'int *const' through 'void *'; use reinterpret_cast instead [bugprone-casting-through-void]25  static_cast<int *const>(static_cast<V>(&d));26  // CHECK-MESSAGES: :[[@LINE-1]]:27: warning: do not cast 'double *' to 'int *const' through 'V' (aka 'void *'); use reinterpret_cast instead [bugprone-casting-through-void]27  static_cast<int *const>(static_cast<void *>(&i));28  // CHECK-MESSAGES: :[[@LINE-1]]:27: warning: do not cast 'int *' to 'int *const' through 'void *'; use reinterpret_cast instead [bugprone-casting-through-void]29 30  static_cast<void *const>(static_cast<void *>(&i));31}32 33void const_test() {34  static_cast<const int *>(static_cast<const void *>(&d));35  // CHECK-MESSAGES: :[[@LINE-1]]:28: warning: do not cast 'double *' to 'const int *' through 'const void *'; use reinterpret_cast instead [bugprone-casting-through-void]36  static_cast<const int *>(static_cast<const V>(&d));37  // CHECK-MESSAGES: :[[@LINE-1]]:28: warning: do not cast 'double *' to 'const int *' through 'const V' (aka 'void *const'); use reinterpret_cast instead [bugprone-casting-through-void]38  static_cast<const int *>(static_cast<const void *>(&i));39  // CHECK-MESSAGES: :[[@LINE-1]]:28: warning: do not cast 'int *' to 'const int *' through 'const void *'; use reinterpret_cast instead [bugprone-casting-through-void]40 41  static_cast<const void *>(static_cast<const void *>(&i));42 43  static_cast<const int *>(static_cast<const void *>(&cd));44  // CHECK-MESSAGES: :[[@LINE-1]]:28: warning: do not cast 'const double *' to 'const int *' through 'const void *'; use reinterpret_cast instead [bugprone-casting-through-void]45  static_cast<const int *>(static_cast<const CV>(&cd));46  // CHECK-MESSAGES: :[[@LINE-1]]:28: warning: do not cast 'const double *' to 'const int *' through 'const CV' (aka 'const void *const'); use reinterpret_cast instead [bugprone-casting-through-void]47  static_cast<const int *>(static_cast<const void *>(&ci));48  // CHECK-MESSAGES: :[[@LINE-1]]:28: warning: do not cast 'const int *' to 'const int *' through 'const void *'; use reinterpret_cast instead [bugprone-casting-through-void]49 50  static_cast<const void *>(static_cast<const void *>(&ci));51}52 53 54void reinterpret_cast_test() {55  static_cast<int *>(reinterpret_cast<void *>(&d));56  // CHECK-MESSAGES: :[[@LINE-1]]:22: warning: do not cast 'double *' to 'int *' through 'void *'; use reinterpret_cast instead [bugprone-casting-through-void]57  reinterpret_cast<int *>(static_cast<void *>(&d));58  // CHECK-MESSAGES: :[[@LINE-1]]:27: warning: do not cast 'double *' to 'int *' through 'void *'; use reinterpret_cast instead [bugprone-casting-through-void]59  reinterpret_cast<int *>(reinterpret_cast<void *>(&d));60  // CHECK-MESSAGES: :[[@LINE-1]]:27: warning: do not cast 'double *' to 'int *' through 'void *'; use reinterpret_cast instead [bugprone-casting-through-void]61 62  static_cast<void *>(reinterpret_cast<void *>(&i));63  reinterpret_cast<void *>(reinterpret_cast<void *>(&i));64  reinterpret_cast<void *>(static_cast<void *>(&i));65}66 67void c_style_cast_test() {68  static_cast<int *>((void *)&d);69  // CHECK-MESSAGES: :[[@LINE-1]]:22: warning: do not cast 'double *' to 'int *' through 'void *'; use reinterpret_cast instead [bugprone-casting-through-void]70  (int *)(void *)&d;71  // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: do not cast 'double *' to 'int *' through 'void *'; use reinterpret_cast instead [bugprone-casting-through-void]72  static_cast<int *>((void *)&d);73  // CHECK-MESSAGES: :[[@LINE-1]]:22: warning: do not cast 'double *' to 'int *' through 'void *'; use reinterpret_cast instead [bugprone-casting-through-void]74 75  static_cast<void *>((void *)&i);76}77 78struct A {79   A(void*);80};81using I = int *;82void cxx_functional_cast() {83  A(static_cast<void*>(&d));84  I(static_cast<void*>(&d));85  // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: do not cast 'double *' to 'I' (aka 'int *') through 'void *'; use reinterpret_cast instead [bugprone-casting-through-void]86}87 88void bit_cast() {89  __builtin_bit_cast(int *, static_cast<void *>(&d));90  // CHECK-MESSAGES: :[[@LINE-1]]:29: warning: do not cast 'double *' to 'int *' through 'void *'; use reinterpret_cast instead [bugprone-casting-through-void]91}92 93namespace PR87069 {94  void castconstVoidToVoid() {95    const void* ptr = nullptr;96    int* numberPtr = static_cast<int*>(const_cast<void*>(ptr));97  }98}99