From 9d2712a824d70fdcf5ce3ea8682af77302ff3711 Mon Sep 17 00:00:00 2001
From: jean-pierre charras <jp.charras@wanadoo.fr>
Date: Sun, 29 Mar 2020 18:42:24 +0200
Subject: [PATCH] Fix a few Coverity warnings. It also fix:

Fixes #4082
https://gitlab.com/kicad/code/kicad/issues/4082
---
 common/plotters/plotter.cpp                   |  1 +
 eeschema/dialogs/dialog_choose_component.cpp  |  7 ++++---
 .../dialog_edit_component_in_schematic.cpp    |  9 ++++++--
 .../dialogs/dialog_fields_editor_global.cpp   |  3 ++-
 eeschema/dialogs/dialog_rescue_each.cpp       |  5 ++++-
 eeschema/libedit/lib_edit_frame.cpp           | 21 +++++++++++--------
 eeschema/sch_field.cpp                        |  5 +++--
 kicad/kicad_manager_frame.cpp                 |  6 ++++++
 pcbnew/class_zone.cpp                         |  2 ++
 pcbnew/router/pns_kicad_iface.cpp             |  3 ++-
 10 files changed, 43 insertions(+), 19 deletions(-)

diff --git a/common/plotters/plotter.cpp b/common/plotters/plotter.cpp
index c24b0123c0..b6d6bb6bb4 100644
--- a/common/plotters/plotter.cpp
+++ b/common/plotters/plotter.cpp
@@ -63,6 +63,7 @@ PLOTTER::PLOTTER( )
     m_mirrorIsHorizontal = true;
     m_yaxisReversed = false;
     outputFile = 0;
+    m_colors = nullptr;
     colorMode = false;          // Starts as a BW plot
     negativeMode = false;
     // Temporary init to avoid not initialized vars, will be set later
diff --git a/eeschema/dialogs/dialog_choose_component.cpp b/eeschema/dialogs/dialog_choose_component.cpp
index f66030ffdd..451376356b 100644
--- a/eeschema/dialogs/dialog_choose_component.cpp
+++ b/eeschema/dialogs/dialog_choose_component.cpp
@@ -143,7 +143,6 @@ DIALOG_CHOOSE_COMPONENT::DIALOG_CHOOSE_COMPONENT( SCH_BASE_FRAME* aParent, const
     Layout();
 
     EESCHEMA_SETTINGS* cfg = dynamic_cast<EESCHEMA_SETTINGS*>( Kiface().KifaceSettings() );
-    wxASSERT( cfg );
 
     if( cfg )
     {
@@ -212,6 +211,8 @@ DIALOG_CHOOSE_COMPONENT::~DIALOG_CHOOSE_COMPONENT()
 
     auto cfg = dynamic_cast<EESCHEMA_SETTINGS*>( Kiface().KifaceSettings() );
 
+    wxCHECK( cfg, /*void*/ );
+
     cfg->m_SymChooserPanel.width = GetSize().x;
     cfg->m_SymChooserPanel.height = GetSize().y;
 
@@ -263,12 +264,12 @@ wxPanel* DIALOG_CHOOSE_COMPONENT::ConstructRightPanel( wxWindow* aParent )
 
     m_keepSymbol = new wxCheckBox( panel, 1000, _("Multi-Symbol Placement"), wxDefaultPosition,
                                    wxDefaultSize, wxALIGN_RIGHT );
-    m_keepSymbol->SetValue( cfg->m_SymChooserPanel.keep_symbol );
+    m_keepSymbol->SetValue( cfg ? cfg->m_SymChooserPanel.keep_symbol : true );
     m_keepSymbol->SetToolTip( _( "Place multiple copies of the symbol." ) );
 
     m_useUnits = new wxCheckBox( panel, 1000, _("Place all units"), wxDefaultPosition,
                                  wxDefaultSize, wxALIGN_RIGHT );
-    m_useUnits->SetValue( cfg->m_SymChooserPanel.place_all_units );
+    m_useUnits->SetValue( cfg ? cfg->m_SymChooserPanel.place_all_units : true );
     m_useUnits->SetToolTip( _( "Sequentially place all units of the symbol." ) );
 
     auto fgSizer = new wxFlexGridSizer( 0, 2, 0, 1 );
diff --git a/eeschema/dialogs/dialog_edit_component_in_schematic.cpp b/eeschema/dialogs/dialog_edit_component_in_schematic.cpp
index 2b04d7aa20..704c5b445e 100644
--- a/eeschema/dialogs/dialog_edit_component_in_schematic.cpp
+++ b/eeschema/dialogs/dialog_edit_component_in_schematic.cpp
@@ -78,7 +78,10 @@ DIALOG_EDIT_COMPONENT_IN_SCHEMATIC::DIALOG_EDIT_COMPONENT_IN_SCHEMATIC( SCH_EDIT
 
     // Show/hide columns according to user's preference
     auto cfg = dynamic_cast<EESCHEMA_SETTINGS*>( Kiface().KifaceSettings() );
-    m_shownColumns = cfg->m_Appearance.edit_component_visible_columns;
+
+    if( cfg )
+        m_shownColumns = cfg->m_Appearance.edit_component_visible_columns;
+
     m_grid->ShowHideColumns( m_shownColumns );
 
     wxToolTip::Enable( true );
@@ -110,7 +113,9 @@ DIALOG_EDIT_COMPONENT_IN_SCHEMATIC::DIALOG_EDIT_COMPONENT_IN_SCHEMATIC( SCH_EDIT
 DIALOG_EDIT_COMPONENT_IN_SCHEMATIC::~DIALOG_EDIT_COMPONENT_IN_SCHEMATIC()
 {
     auto cfg = dynamic_cast<EESCHEMA_SETTINGS*>( Kiface().KifaceSettings() );
-    cfg->m_Appearance.edit_component_visible_columns = m_grid->GetShownColumns();
+
+    if( cfg )
+        cfg->m_Appearance.edit_component_visible_columns = m_grid->GetShownColumns();
 
     // Prevents crash bug in wxGrid's d'tor
     m_grid->DestroyTable( m_fields );
diff --git a/eeschema/dialogs/dialog_fields_editor_global.cpp b/eeschema/dialogs/dialog_fields_editor_global.cpp
index 40db962dd5..f5b8031ab0 100644
--- a/eeschema/dialogs/dialog_fields_editor_global.cpp
+++ b/eeschema/dialogs/dialog_fields_editor_global.cpp
@@ -932,7 +932,8 @@ void DIALOG_FIELDS_EDITOR_GLOBAL::LoadFieldNames()
 
     // Force References to always be shown
     auto cfg = dynamic_cast<EESCHEMA_SETTINGS*>( Kiface().KifaceSettings() );
-    wxASSERT( cfg );
+    wxCHECK( cfg, /*void*/ );
+
     cfg->m_FieldEditorPanel.fields_show["Reference"] = true;
 
     // *DO NOT* use translated mandatory field names:
diff --git a/eeschema/dialogs/dialog_rescue_each.cpp b/eeschema/dialogs/dialog_rescue_each.cpp
index 1918aa6177..7fc56e3c33 100644
--- a/eeschema/dialogs/dialog_rescue_each.cpp
+++ b/eeschema/dialogs/dialog_rescue_each.cpp
@@ -293,7 +293,10 @@ void DIALOG_RESCUE_EACH::OnNeverShowClick( wxCommandEvent& aEvent )
     if( resp == wxID_YES )
     {
         auto cfg = dynamic_cast<EESCHEMA_SETTINGS*>( Kiface().KifaceSettings() );
-        cfg->m_RescueNeverShow = true;
+
+        if( cfg )
+            cfg->m_RescueNeverShow = true;
+
         m_Rescuer->m_chosen_candidates.clear();
         Close();
     }
diff --git a/eeschema/libedit/lib_edit_frame.cpp b/eeschema/libedit/lib_edit_frame.cpp
index e8f194a3b1..f9cc1eaa07 100644
--- a/eeschema/libedit/lib_edit_frame.cpp
+++ b/eeschema/libedit/lib_edit_frame.cpp
@@ -224,15 +224,18 @@ void LIB_EDIT_FRAME::LoadSettings( APP_SETTINGS_BASE* aCfg )
     auto cfg = dynamic_cast<LIBEDIT_SETTINGS*>( aCfg );
     wxASSERT( cfg );
 
-    SetDefaultLineThickness( Mils2iu( cfg->m_Defaults.line_width ) );
-    SetDefaultPinLength( Mils2iu( cfg->m_Defaults.pin_length ) );
-    m_textPinNameDefaultSize = Mils2iu( cfg->m_Defaults.pin_name_size );
-    m_textPinNumDefaultSize = Mils2iu( cfg->m_Defaults.pin_num_size );
-    SetRepeatDeltaLabel( cfg->m_Repeat.label_delta );
-    SetRepeatPinStep( Mils2iu( cfg->m_Repeat.pin_step ) );
-    SetRepeatStep( wxPoint( cfg->m_Repeat.x_step, cfg->m_Repeat.y_step ) );
-    m_showPinElectricalTypeName = cfg->m_ShowPinElectricalType;
-    m_defaultLibWidth = cfg->m_LibWidth;
+    if( cfg )
+    {
+        SetDefaultLineThickness( Mils2iu( cfg->m_Defaults.line_width ) );
+        SetDefaultPinLength( Mils2iu( cfg->m_Defaults.pin_length ) );
+        m_textPinNameDefaultSize = Mils2iu( cfg->m_Defaults.pin_name_size );
+        m_textPinNumDefaultSize = Mils2iu( cfg->m_Defaults.pin_num_size );
+        SetRepeatDeltaLabel( cfg->m_Repeat.label_delta );
+        SetRepeatPinStep( Mils2iu( cfg->m_Repeat.pin_step ) );
+        SetRepeatStep( wxPoint( cfg->m_Repeat.x_step, cfg->m_Repeat.y_step ) );
+        m_showPinElectricalTypeName = cfg->m_ShowPinElectricalType;
+        m_defaultLibWidth = cfg->m_LibWidth;
+    }
 
     // TODO(JE) does libedit need its own TemplateFieldNames?
     auto ee_settings = Pgm().GetSettingsManager().GetAppSettings<EESCHEMA_SETTINGS>();
diff --git a/eeschema/sch_field.cpp b/eeschema/sch_field.cpp
index 731a908548..02b2200bd5 100644
--- a/eeschema/sch_field.cpp
+++ b/eeschema/sch_field.cpp
@@ -525,7 +525,8 @@ void SCH_FIELD::SetPosition( const wxPoint& aPosition )
         SCH_COMPONENT* parentComponent = static_cast<SCH_COMPONENT*>( m_Parent );
         wxPoint        relativePos = aPosition - parentComponent->GetPosition();
 
-        parentComponent->GetTransform().InverseTransform().TransformCoordinate( relativePos );
+        relativePos = parentComponent->GetTransform().
+                            InverseTransform().TransformCoordinate( relativePos );
 
         SetTextPos( relativePos + parentComponent->GetPosition() );
     }
@@ -541,7 +542,7 @@ wxPoint SCH_FIELD::GetPosition() const
         SCH_COMPONENT* parentComponent = static_cast<SCH_COMPONENT*>( m_Parent );
         wxPoint        relativePos = GetTextPos() - parentComponent->GetPosition();
 
-        parentComponent->GetTransform().TransformCoordinate( relativePos );
+        relativePos = parentComponent->GetTransform().TransformCoordinate( relativePos );
 
         return relativePos + parentComponent->GetPosition();
     }
diff --git a/kicad/kicad_manager_frame.cpp b/kicad/kicad_manager_frame.cpp
index f2bb8bbb77..7cd8f1eb45 100644
--- a/kicad/kicad_manager_frame.cpp
+++ b/kicad/kicad_manager_frame.cpp
@@ -504,6 +504,9 @@ void KICAD_MANAGER_FRAME::LoadSettings( APP_SETTINGS_BASE* aCfg )
     EDA_BASE_FRAME::LoadSettings( aCfg );
 
     auto settings = dynamic_cast<KICAD_SETTINGS*>( aCfg );
+
+    wxCHECK( settings, /*void*/);
+
     m_leftWinWidth = settings->m_LeftWinWidth;
 }
 
@@ -513,6 +516,9 @@ void KICAD_MANAGER_FRAME::SaveSettings( APP_SETTINGS_BASE* aCfg )
     EDA_BASE_FRAME::SaveSettings( aCfg );
 
     auto settings = dynamic_cast<KICAD_SETTINGS*>( aCfg );
+
+    wxCHECK( settings, /*void*/);
+
     settings->m_LeftWinWidth = m_leftWin->GetSize().x;
 }
 
diff --git a/pcbnew/class_zone.cpp b/pcbnew/class_zone.cpp
index bb626f8cba..6d46524f93 100644
--- a/pcbnew/class_zone.cpp
+++ b/pcbnew/class_zone.cpp
@@ -182,6 +182,8 @@ void ZONE_CONTAINER::initDataFromSrcInCopyCtor( const ZONE_CONTAINER& aZone )
     // (has meaning only for copper zones)
     m_netinfo = aZone.m_netinfo;
 
+    m_area = aZone.m_area;
+
     SetNeedRefill( aZone.NeedRefill() );
 }
 
diff --git a/pcbnew/router/pns_kicad_iface.cpp b/pcbnew/router/pns_kicad_iface.cpp
index fd911e909c..ea39fdb2f2 100644
--- a/pcbnew/router/pns_kicad_iface.cpp
+++ b/pcbnew/router/pns_kicad_iface.cpp
@@ -532,6 +532,7 @@ PNS_KICAD_IFACE_BASE::PNS_KICAD_IFACE_BASE()
     m_board = nullptr;
     m_router = nullptr;
     m_debugDecorator = nullptr;
+    m_router = nullptr;
 }
 
 
@@ -1458,7 +1459,7 @@ void PNS_KICAD_IFACE::SetView( KIGFX::VIEW* aView )
     m_view = aView;
     m_previewItems = new KIGFX::VIEW_GROUP( m_view );
     m_previewItems->SetLayer( LAYER_SELECT_OVERLAY ) ;
-    
+
     if(m_view)
         m_view->Add( m_previewItems );