[PATCH] D48866: [clang-tidy] Add incorrect-pointer-cast checker

Roman Lebedev via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Mon Jun 3 07:45:43 PDT 2019


lebedev.ri added a comment.

Some basic thoughts



================
Comment at: clang-tools-extra/clang-tidy/bugprone/IncorrectPointerCastCheck.cpp:63
+         "cast from %0 to %1 may lead to access memory based on invalid memory "
+         "layout; pointed to type is wider than the allocated type")
+        << SrcPointedType << DestPointedType;
----------------
this reads weirdly, should be
"new type is wider (%2) than the original type (%3)"



================
Comment at: clang-tools-extra/clang-tidy/bugprone/IncorrectPointerCastCheck.cpp:69-70
+         "cast from %0 to %1 may lead to access memory based on invalid "
+         "memory layout; pointed to type is strictly aligned than the "
+         "allocated type")
+        << SrcPointedType << DestPointedType;
----------------
"*more* strictly aligned" perhaps?
Similarly, specify the actual values.


================
Comment at: clang-tools-extra/clang-tidy/bugprone/IncorrectPointerCastCheck.cpp:88
+      if (SrcField.getType() != DestField.getType() || SrcIterator == SrcEnd) {
+        FieldsAreSame = false;
+      }
----------------
`break;'?


================
Comment at: clang-tools-extra/clang-tidy/bugprone/IncorrectPointerCastCheck.cpp:95
+           "cast from %0 to %1 may lead to access memory based on invalid "
+           "memory layout; struct members are incompatible")
+          << SrcPointedType << DestPointedType;
----------------
Would be better to at least point to first two incompatible fields


================
Comment at: clang-tools-extra/clang-tidy/bugprone/IncorrectPointerCastCheck.cpp:98-107
+  } else if (WarnForDifferentSignedness &&
+             ((SrcPointedType->isSignedIntegerType() &&
+               DestPointedType->isUnsignedIntegerType()) ||
+              (SrcPointedType->isUnsignedIntegerType() &&
+               DestPointedType->isSignedIntegerType()))) {
+    diag(castExpr->getBeginLoc(),
+         "cast from %0 to %1 may lead to access memory based on invalid "
----------------
What does this mean?
How can signedness affect memory layout?


================
Comment at: clang-tools-extra/clang-tidy/bugprone/IncorrectPointerCastCheck.h:18
+
+/// Warns for cases when pointer is cast and the pointed to type is incompatible
+/// with allocated memory area type. This may lead to access memory based on
----------------
is cast*ed*
s/pointed to/new/


================
Comment at: clang-tools-extra/clang-tidy/bugprone/IncorrectPointerCastCheck.h:19
+/// Warns for cases when pointer is cast and the pointed to type is incompatible
+/// with allocated memory area type. This may lead to access memory based on
+/// invalid memory layout.
----------------
How do you know anything about the actual `allocated memory area type`.
You probably want to talk about the original type before cast.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D48866/new/

https://reviews.llvm.org/D48866





More information about the cfe-commits mailing list