[PATCH] D16377: Ensure virtual-near-miss does not crash on functions without names

Aaron Ballman via cfe-commits cfe-commits at lists.llvm.org
Wed Jan 20 14:55:21 PST 2016


aaron.ballman updated this revision to Diff 45451.
aaron.ballman added a comment.

Now checking that both the base *and* the derived functions have names.


http://reviews.llvm.org/D16377

Files:
  clang-tidy/misc/VirtualNearMissCheck.cpp
  test/clang-tidy/misc-virtual-near-miss.cpp

Index: test/clang-tidy/misc-virtual-near-miss.cpp
===================================================================
--- test/clang-tidy/misc-virtual-near-miss.cpp
+++ test/clang-tidy/misc-virtual-near-miss.cpp
@@ -63,3 +63,20 @@
 private:
   void funk(); // Should not warn: access qualifers don't match.
 };
+
+namespace {
+// Ensure this code does not crash due to special member functions.
+class  _Facet_base {
+public:
+  virtual ~_Facet_base() noexcept {}
+};
+
+class facet : public _Facet_base {
+protected:
+  virtual ~facet() noexcept {}
+
+public:
+  facet(const facet&) = delete;
+  facet& operator=(const facet&) = delete;
+};
+}
Index: clang-tidy/misc/VirtualNearMissCheck.cpp
===================================================================
--- clang-tidy/misc/VirtualNearMissCheck.cpp
+++ clang-tidy/misc/VirtualNearMissCheck.cpp
@@ -244,8 +244,16 @@
         if (isOverriddenByDerivedClass(BaseMD, DerivedRD))
           continue;
 
+        // If the function has an identifier for a name, then use that
+        // identifier to determine the edit distance. If the function is a
+        // special member function without an identifier, assume the edit
+        // distance is nonzero to determine whether the signature is a near
+        // miss or not.
         unsigned EditDistance =
-            BaseMD->getName().edit_distance(DerivedMD->getName());
+            (BaseMD->getDeclName().isIdentifier() &&
+             DerivedMD->getDeclName().isIdentifier())
+                ? BaseMD->getName().edit_distance(DerivedMD->getName())
+                : 1;
         if (EditDistance > 0 && EditDistance <= EditDistanceThreshold) {
           if (checkOverrideWithoutName(Context, BaseMD, DerivedMD)) {
             // A "virtual near miss" is found.


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D16377.45451.patch
Type: text/x-patch
Size: 1778 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20160120/38e0438c/attachment.bin>


More information about the cfe-commits mailing list