[clang-tools-extra] [clang-tidy]add new check `bugprone-compare-pointer-to-member-virtual-function` (PR #66055)
via cfe-commits
cfe-commits at lists.llvm.org
Wed Sep 13 21:53:24 PDT 2023
================
@@ -0,0 +1,66 @@
+.. title:: clang-tidy - bugprone-compare-pointer-to-member-virtual-function
+
+bugprone-compare-pointer-to-member-virtual-function
+===================================================
+
+Detects unspecified behavior about equality comparison between pointer to member
+virtual function and anything other than null-pointer-constant.
+
+
+.. code-block:: c++
+ struct A {
+ void f1();
+ void f2();
+ virtual void f3();
+ virtual void f4();
+
+ void g1(int);
+ };
+
+ void fn() {
+ bool r1 = (&A::f1 == &A::f2); // ok
+ bool r2 = (&A::f1 == &A::f3); // bugprone
+ bool r3 = (&A::f1 != &A::f3); // bugprone
+ bool r4 = (&A::f3 == nullptr); // ok
+ bool r5 = (&A::f3 == &A::f4); // bugprone
+
+ void (A::*v1)() = &A::f3;
+ bool r6 = (v1 == &A::f1); // bugprone
+ bool r6 = (v1 == nullptr); // ok
+
+ void (A::*v2)() = &A::f2;
+ bool r7 = (v2 == &A::f1); // false positive, but potential risk if assigning other value to v2.
+
+ void (A::*v3)(int) = &A::g1;
+ bool r8 = (v3 == &A::g1); // ok, no virtual function match void(A::*)(int) signature.
+ }
+
+
+Provide warnings on equality comparisons involve pointers to member virtual
+function or variables which is potential pointer to member virtual function and
+any entity other than a null-pointer constant.
+
+In certain compilers, virtual function addresses are not conventional pointers
+but instead consist of offsets and indexes within a virtual function table
+(vtable). Consequently, these pointers may vary between base and derived
+classes, leading to unpredictable behavior when compared directly. This issue
+becomes particularly challenging when dealing with pointers to pure virtual
+functions, as they may not even have a valid address, further complicating
+comparisons.
+
+Instead, it is recommended to utilize the ``typeid`` operator or other appropriate
+mechanisms for comparing objects to ensure robust and predictable behavior in
+your codebase. By heeding this detection and adopting a more reliable comparison
+method, you can mitigate potential issues related to unspecified behavior,
+especially when dealing with pointers to member virtual functions or pure
+virtual functions, thereby improving the overall stability and maintainability
+of your code. In scenarios involving pointers to member virtual functions, it's
+only advisable to employ ``nullptr`` for comparisons.
+
+
----------------
EugeneZelenko wrote:
Ditto.
https://github.com/llvm/llvm-project/pull/66055
More information about the cfe-commits
mailing list