[Libreoffice-commits] core.git: compilerplugins/clang sc/source

Noel Grandin noel at peralex.com
Fri Nov 13 05:18:30 PST 2015


 compilerplugins/clang/ptrvector.cxx |   81 ++++++++++++++++++++++++++++++++++++
 sc/source/core/data/conditio.cxx    |    3 -
 2 files changed, 83 insertions(+), 1 deletion(-)

New commits:
commit f73284fb864699716b3a52faf2ad39bc8e48c3cc
Author: Noel Grandin <noel at peralex.com>
Date:   Thu Nov 12 16:14:04 2015 +0200

    new loplugin ptrvector - find bad comparison of container<unique_ptr>
    
    Change-Id: Idb18ae1ca2f7c644680703dc3b7dd3cd6000e040

diff --git a/compilerplugins/clang/ptrvector.cxx b/compilerplugins/clang/ptrvector.cxx
new file mode 100644
index 0000000..513d350
--- /dev/null
+++ b/compilerplugins/clang/ptrvector.cxx
@@ -0,0 +1,81 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include <cassert>
+#include <string>
+#include <iostream>
+#include <fstream>
+#include <set>
+#include "plugin.hxx"
+#include "compat.hxx"
+
+/**
+  Check for calls to operator== on a std::container< std::unique_ptr >, which is not useful,
+  because std::container will compare the pointers so it is never true
+*/
+
+namespace {
+
+class PtrVector:
+    public RecursiveASTVisitor<PtrVector>, public loplugin::Plugin
+{
+public:
+    explicit PtrVector(InstantiationData const & data): Plugin(data) {}
+
+    virtual void run() override
+    {
+        TraverseDecl(compiler.getASTContext().getTranslationUnitDecl());
+    }
+
+    bool shouldVisitTemplateInstantiations () const { return true; }
+
+    bool VisitCXXOperatorCallExpr(const CXXOperatorCallExpr* );
+};
+
+bool PtrVector::VisitCXXOperatorCallExpr(const CXXOperatorCallExpr* expr)
+{
+    if (ignoreLocation(expr)) {
+        return true;
+    }
+    if (expr->getOperator() != clang::OverloadedOperatorKind::OO_EqualEqual
+        && expr->getOperator() != clang::OverloadedOperatorKind::OO_ExclaimEqual)
+    {
+        return true;
+    }
+    if (isa<CXXNullPtrLiteralExpr>(expr->getArg(1))) {
+        return true;
+    }
+    const Expr* argExpr = expr->getArg(0);
+    std::string s = argExpr->getType().getDesugaredType(compiler.getASTContext()).getAsString();
+    if (s.find("iterator") != std::string::npos) {
+        return true;
+    }
+    if (s.find("array") == std::string::npos && s.find("deque") == std::string::npos
+        && s.find("list") == std::string::npos && s.find("vector") == std::string::npos
+        && s.find("set") == std::string::npos && s.find("map") == std::string::npos
+        && s.find("stack") == std::string::npos && s.find("queue") == std::string::npos)
+    {
+        return true;
+    }
+    if (s.find("unique_ptr") != std::string::npos) {
+         expr->getArg(1)->dump();
+        report(
+            DiagnosticsEngine::Warning,
+            "do not call operator== on a std container containing a unique_ptr " + s,
+            expr->getExprLoc());
+    }
+    return true;
+}
+
+
+loplugin::Plugin::Registration< PtrVector > X("ptrvector");
+
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sc/source/core/data/conditio.cxx b/sc/source/core/data/conditio.cxx
index 61aee69..abcd231 100644
--- a/sc/source/core/data/conditio.cxx
+++ b/sc/source/core/data/conditio.cxx
@@ -23,6 +23,7 @@
 #include <svl/zforlist.hxx>
 #include <rtl/math.hxx>
 #include <unotools/collatorwrapper.hxx>
+#include <comphelper/stl_types.hxx>
 
 #include <com/sun/star/sheet/ConditionOperator2.hpp>
 
@@ -1831,7 +1832,7 @@ bool ScConditionalFormat::EqualEntries( const ScConditionalFormat& r ) const
 
     //TODO: Test for same entries in reverse order?
     for (size_t i=0; i<size(); i++)
-        if ( ! (maEntries == r.maEntries ) )
+        if ( ! ::comphelper::ContainerUniquePtrEquals(maEntries, r.maEntries) )
             return false;
 
     // right now don't check for same range


More information about the Libreoffice-commits mailing list