Skip to content

Commit 5a6c222

Browse files
committed
Fix Coverity null pointer dereference issues
1 parent a9145f1 commit 5a6c222

File tree

4 files changed

+17
-22
lines changed

4 files changed

+17
-22
lines changed

src/analysis/vector/geometry_checker/qgsgeometryoverlapcheck.cpp

Lines changed: 13 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ void QgsGeometryOverlapCheck::fixError( QgsGeometryCheckError *error, int method
9898
error->setObsolete();
9999
return;
100100
}
101-
QgsAbstractGeometry *interGeom = geomEngineA->intersection( layerFeatureB.geometry(), &errMsg );
101+
std::unique_ptr< QgsAbstractGeometry > interGeom( geomEngineA->intersection( layerFeatureB.geometry(), &errMsg ) );
102102
if ( !interGeom )
103103
{
104104
error->setFixFailed( tr( "Failed to compute intersection between overlapping features: %1" ).arg( errMsg ) );
@@ -109,7 +109,7 @@ void QgsGeometryOverlapCheck::fixError( QgsGeometryCheckError *error, int method
109109
QgsAbstractGeometry *interPart = nullptr;
110110
for ( int iPart = 0, nParts = interGeom->partCount(); iPart < nParts; ++iPart )
111111
{
112-
QgsAbstractGeometry *part = QgsGeometryCheckerUtils::getGeomPart( interGeom, iPart );
112+
QgsAbstractGeometry *part = QgsGeometryCheckerUtils::getGeomPart( interGeom.get(), iPart );
113113
if ( std::fabs( part->area() - overlapError->value().toDouble() ) < mContext->reducedTolerance &&
114114
QgsGeometryCheckerUtils::pointsFuzzyEqual( part->centroid(), overlapError->location(), mContext->reducedTolerance ) )
115115
{
@@ -119,7 +119,6 @@ void QgsGeometryOverlapCheck::fixError( QgsGeometryCheckError *error, int method
119119
}
120120
if ( !interPart || interPart->isEmpty() )
121121
{
122-
delete interGeom;
123122
error->setObsolete();
124123
return;
125124
}
@@ -131,30 +130,28 @@ void QgsGeometryOverlapCheck::fixError( QgsGeometryCheckError *error, int method
131130
}
132131
else if ( method == Subtract )
133132
{
134-
QgsAbstractGeometry *diff1 = geomEngineA->difference( interPart, &errMsg );
133+
std::unique_ptr< QgsAbstractGeometry > diff1( geomEngineA->difference( interPart, &errMsg ) );
135134
if ( !diff1 || diff1->isEmpty() )
136135
{
137-
delete diff1;
138-
diff1 = nullptr;
136+
diff1.reset();
139137
}
140138
else
141139
{
142-
QgsGeometryCheckerUtils::filter1DTypes( diff1 );
140+
QgsGeometryCheckerUtils::filter1DTypes( diff1.get() );
143141
}
144142
std::unique_ptr< QgsGeometryEngine > geomEngineB = QgsGeometryCheckerUtils::createGeomEngine( layerFeatureB.geometry(), mContext->reducedTolerance );
145-
QgsAbstractGeometry *diff2 = geomEngineB->difference( interPart, &errMsg );
143+
std::unique_ptr< QgsAbstractGeometry > diff2( geomEngineB->difference( interPart, &errMsg ) );
146144
if ( !diff2 || diff2->isEmpty() )
147145
{
148-
delete diff2;
149-
diff2 = nullptr;
146+
diff2.reset();
150147
}
151148
else
152149
{
153-
QgsGeometryCheckerUtils::filter1DTypes( diff2 );
150+
QgsGeometryCheckerUtils::filter1DTypes( diff2.get() );
154151
}
155-
double shared1 = diff1 ? QgsGeometryCheckerUtils::sharedEdgeLength( diff1, interPart, mContext->reducedTolerance ) : 0;
156-
double shared2 = diff2 ? QgsGeometryCheckerUtils::sharedEdgeLength( diff2, interPart, mContext->reducedTolerance ) : 0;
157-
if ( shared1 == 0. || shared2 == 0. )
152+
double shared1 = diff1 ? QgsGeometryCheckerUtils::sharedEdgeLength( diff1.get(), interPart, mContext->reducedTolerance ) : 0;
153+
double shared2 = diff2 ? QgsGeometryCheckerUtils::sharedEdgeLength( diff2.get(), interPart, mContext->reducedTolerance ) : 0;
154+
if ( !diff1 || !diff2 || shared1 == 0. || shared2 == 0. )
158155
{
159156
error->setFixFailed( tr( "Could not find shared edges between intersection and overlapping features" ) );
160157
}
@@ -163,32 +160,27 @@ void QgsGeometryOverlapCheck::fixError( QgsGeometryCheckError *error, int method
163160
if ( shared1 < shared2 )
164161
{
165162
diff1->transform( featurePoolA->getLayerToMapTransform(), QgsCoordinateTransform::ReverseTransform );
166-
featureA.setGeometry( QgsGeometry( diff1 ) );
167-
diff1 = 0;
163+
featureA.setGeometry( QgsGeometry( std::move( diff1 ) ) );
168164

169165
changes[error->layerId()][featureA.id()].append( Change( ChangeFeature, ChangeChanged ) );
170166
featurePoolA->updateFeature( featureA );
171167
}
172168
else
173169
{
174170
diff2->transform( featurePoolB->getLayerToMapTransform(), QgsCoordinateTransform::ReverseTransform );
175-
featureB.setGeometry( QgsGeometry( diff2 ) );
176-
diff2 = 0;
171+
featureB.setGeometry( QgsGeometry( std::move( diff2 ) ) );
177172

178173
changes[overlapError->overlappedFeature().first][featureB.id()].append( Change( ChangeFeature, ChangeChanged ) );
179174
featurePoolB->updateFeature( featureB );
180175
}
181176

182177
error->setFixed( method );
183178
}
184-
delete diff1;
185-
delete diff2;
186179
}
187180
else
188181
{
189182
error->setFixFailed( tr( "Unknown method" ) );
190183
}
191-
delete interGeom;
192184
}
193185

194186
QStringList QgsGeometryOverlapCheck::getResolutionMethods() const

src/core/geometry/qgsgeometrymakevalid.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -388,6 +388,7 @@ static bool ring_make_geos_friendly( QgsCurve *ring )
388388

389389
// earlier we allowed in only geometries with straight segments
390390
QgsLineString *linestring = qgsgeometry_cast<QgsLineString *>( ring );
391+
Q_ASSERT_X( linestring, "ring_make_geos_friendly", "ring was not a linestring" );
391392

392393
// close the ring if not already closed (2d only)
393394

src/core/layout/qgslayoutitemgroupundocommand.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ void QgsLayoutItemGroupUndoCommand::switchState()
6060
{
6161
// ungroup
6262
QgsLayoutItemGroup *group = dynamic_cast< QgsLayoutItemGroup * >( mLayout->itemByUuid( mGroupUuid ) );
63+
Q_ASSERT_X( group, "QgsLayoutItemGroupUndoCommand::switchState", "Could not find group" );
6364
group->removeItems();
6465
mLayout->removeLayoutItemPrivate( group );
6566
mState = Ungrouped;

src/gui/qgsattributeform.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -897,7 +897,8 @@ void QgsAttributeForm::onConstraintStatusChanged( const QString &constraint,
897897

898898
QgsAttributeFormEditorWidget *formEditorWidget = mFormEditorWidgets.value( eww->fieldIdx() );
899899

900-
formEditorWidget->setConstraintStatus( constraint, description, err, result );
900+
if ( formEditorWidget )
901+
formEditorWidget->setConstraintStatus( constraint, description, err, result );
901902
}
902903

903904
QList<QgsEditorWidgetWrapper *> QgsAttributeForm::constraintDependencies( QgsEditorWidgetWrapper *w )

0 commit comments

Comments
 (0)