[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:44:47 PST 2016
aaron.ballman created this revision.
aaron.ballman added reviewers: congliu, alexfh.
aaron.ballman added a subscriber: cfe-commits.
Special member functions don't always have names, and so calling FunctionDecl::getName() can cause assertions. This patch addresses the issue by assuming any such function needs to have the rest of its signature checked, regardless of the function name. The test case was pulled from MSVC's STL headers, where this check is causing failed assertions.
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,15 @@
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()
+ ? 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.45450.patch
Type: text/x-patch
Size: 1719 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20160120/8a8cd55e/attachment.bin>
More information about the cfe-commits
mailing list