compilerplugins/clang/vclwidgets.cxx | 53 +++++++++++++---------------------- include/vcl/dialog.hxx | 4 +- include/vcl/edit.hxx | 2 - vcl/source/control/edit.cxx | 4 +- vcl/source/window/dialog.cxx | 8 ++--- 5 files changed, 30 insertions(+), 41 deletions(-)
New commits: commit a55658c2100aed2cac4389a3c5ebd8185b7d4c23 Author: Noel Grandin <[email protected]> Date: Fri Jan 9 11:33:52 2015 +0200 vcl:compilerplugin: new rule, no passing of vcl::Window by VclPtr to prevent problems with accidentally deleting an object by doing this: Button *pButton = new Button(NULL); ... pButton->callAMethodThatTakesARef(pButton); Since we take a ref as we construct a temporary VclReference<> - but this will dispose & delete the pButton as we return to the frame doing the callAMethod Change-Id: I60fc211b27fe7ff463aa58f1da106f430fc65529 diff --git a/compilerplugins/clang/vclwidgets.cxx b/compilerplugins/clang/vclwidgets.cxx index 896cd3f..1f8e05b 100644 --- a/compilerplugins/clang/vclwidgets.cxx +++ b/compilerplugins/clang/vclwidgets.cxx @@ -37,8 +37,6 @@ public: bool VisitParmVarDecl(ParmVarDecl const * decl); - bool VisitVarDecl( const VarDecl* var ); - bool VisitFunctionDecl( const FunctionDecl* var ); }; @@ -90,7 +88,7 @@ bool VCLWidgets::VisitCXXRecordDecl(const CXXRecordDecl * recordDecl) { } bool foundVclPtr = false; for(auto fieldDecl : recordDecl->fields()) { - if (fieldDecl->getType().getAsString().find("VclPtr")==0) { + if (fieldDecl->getType().getAsString().find("VclPtr") != std::string::npos) { foundVclPtr = true; break; } @@ -153,38 +151,24 @@ bool VCLWidgets::VisitFieldDecl(const FieldDecl * fieldDecl) { return true; } -bool VCLWidgets::VisitParmVarDecl(ParmVarDecl const * pvDecl) { +bool VCLWidgets::VisitParmVarDecl(ParmVarDecl const * pvDecl) +{ if (ignoreLocation(pvDecl)) { return true; } - // check if this parameter is derived from Window - if (isPointerToWindowSubclass(pvDecl->getType())) { - report( - DiagnosticsEngine::Remark, - "vcl::Window subclass passed as a pointer parameter, should be wrapped in VclPtr.", - pvDecl->getLocation()) - << pvDecl->getSourceRange(); - } - return true; -} - -bool VCLWidgets::VisitVarDecl( const VarDecl* varDecl ) -{ - if (ignoreLocation(varDecl)) { + // ignore the stuff in the VclPtr template class + const CXXMethodDecl *pMethodDecl = dyn_cast<CXXMethodDecl>(pvDecl->getDeclContext()); + if (pMethodDecl + && pMethodDecl->getParent()->getQualifiedNameAsString().find("VclPtr") != std::string::npos) { return true; } - if (!varDecl->isLocalVarDecl()) - return true; - - // check if this variables type is derived from Window - if (isPointerToWindowSubclass(varDecl->getType())) { + if (pvDecl->getType().getAsString().find("VclPtr") != std::string::npos) { report( - DiagnosticsEngine::Remark, - "vcl::Window subclass declared as a pointer var, should be wrapped in VclPtr.", - varDecl->getLocation()) - << varDecl->getSourceRange(); + DiagnosticsEngine::Warning, + "vcl::Window subclass passed as a VclPtr parameter, should be passed as a raw pointer.", + pvDecl->getLocation()) + << pvDecl->getSourceRange(); } - return true; } @@ -193,12 +177,17 @@ bool VCLWidgets::VisitFunctionDecl( const FunctionDecl* functionDecl ) if (ignoreLocation(functionDecl)) { return true; } + // ignore the stuff in the VclPtr template class + const CXXMethodDecl *pMethodDecl = dyn_cast<CXXMethodDecl>(functionDecl); + if (pMethodDecl + && pMethodDecl->getParent()->getQualifiedNameAsString().find("VclPtr") != std::string::npos) { + return true; + } QualType t1 { compat::getReturnType(*functionDecl) }; - // check if this variables type is derived from Window - if (isPointerToWindowSubclass(t1)) { + if (t1.getAsString().find("VclPtr") != std::string::npos) { report( - DiagnosticsEngine::Remark, - "vcl::Window subclass declared as a return type from a method/function, should be wrapped in VclPtr.", + DiagnosticsEngine::Warning, + "VclPtr declared as a return type from a method/function, should be passed as a raw pointer.", functionDecl->getLocation()) << functionDecl->getSourceRange(); } diff --git a/include/vcl/dialog.hxx b/include/vcl/dialog.hxx index cf1c6ff..722fc1a 100644 --- a/include/vcl/dialog.hxx +++ b/include/vcl/dialog.hxx @@ -77,8 +77,8 @@ protected: protected: friend class VclBuilder; - void set_action_area(const VclPtr<VclButtonBox> &xBox); - void set_content_area(const VclPtr<VclBox> &xBox); + void set_action_area(VclButtonBox* pBox); + void set_content_area(VclBox* pBox); public: explicit Dialog( vcl::Window* pParent, WinBits nStyle = WB_STDDIALOG ); diff --git a/include/vcl/edit.hxx b/include/vcl/edit.hxx index 59d1ce0..78c7fd2 100644 --- a/include/vcl/edit.hxx +++ b/include/vcl/edit.hxx @@ -236,7 +236,7 @@ public: virtual const Link& GetModifyHdl() const { return maModifyHdl; } virtual void SetUpdateDataHdl( const Link& rLink ) { maUpdateDataHdl = rLink; } - void SetSubEdit( const VclPtr<Edit>& pEdit ); + void SetSubEdit( Edit* pEdit ); Edit* GetSubEdit() const { return mpSubEdit; } boost::signals2::signal< void ( Edit* ) > autocompleteSignal; diff --git a/vcl/source/control/edit.cxx b/vcl/source/control/edit.cxx index 3f17870..0ba3df2 100644 --- a/vcl/source/control/edit.cxx +++ b/vcl/source/control/edit.cxx @@ -2706,10 +2706,10 @@ void Edit::ClearModifyFlag() mbModified = false; } -void Edit::SetSubEdit( const VclPtr<Edit>& pEdit ) +void Edit::SetSubEdit( Edit* pEdit ) { mpSubEdit.disposeAndClear(); - mpSubEdit = pEdit; + mpSubEdit.set( pEdit ); if ( mpSubEdit ) { SetPointer( POINTER_ARROW ); // Nur das SubEdit hat den BEAM... diff --git a/vcl/source/window/dialog.cxx b/vcl/source/window/dialog.cxx index 4526f8a..50c982e 100644 --- a/vcl/source/window/dialog.cxx +++ b/vcl/source/window/dialog.cxx @@ -513,14 +513,14 @@ Dialog::Dialog(vcl::Window* pParent, WinBits nStyle) ImplInit( pParent, nStyle ); } -void Dialog::set_action_area(const VclPtr<VclButtonBox> &xBox) +void Dialog::set_action_area(VclButtonBox* pBox) { - mpActionArea = xBox; + mpActionArea.set(pBox); } -void Dialog::set_content_area(const VclPtr<VclBox> &xBox) +void Dialog::set_content_area(VclBox* pBox) { - mpContentArea = xBox; + mpContentArea.set(pBox); } void Dialog::settingOptimalLayoutSize(VclBox *pBox) _______________________________________________ Libreoffice-commits mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
