Skip to content

Commit 0e5214c

Browse files
committed
Don't crash when iterating empty QgsFields
1 parent db69451 commit 0e5214c

File tree

2 files changed

+33
-0
lines changed

2 files changed

+33
-0
lines changed

src/core/qgsfield.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -441,32 +441,50 @@ bool QgsFields::operator==( const QgsFields &other ) const
441441

442442
QgsFields::const_iterator QgsFields::constBegin() const noexcept
443443
{
444+
if ( d->fields.isEmpty() )
445+
return const_iterator();
446+
444447
return const_iterator( &d->fields.first() );
445448
}
446449

447450
QgsFields::const_iterator QgsFields::constEnd() const noexcept
448451
{
452+
if ( d->fields.isEmpty() )
453+
return const_iterator();
454+
449455
return const_iterator( &d->fields.last() + 1 );
450456
}
451457

452458
QgsFields::const_iterator QgsFields::begin() const noexcept
453459
{
460+
if ( d->fields.isEmpty() )
461+
return const_iterator();
462+
454463
return const_iterator( &d->fields.first() );
455464
}
456465

457466
QgsFields::const_iterator QgsFields::end() const noexcept
458467
{
468+
if ( d->fields.isEmpty() )
469+
return const_iterator();
470+
459471
return const_iterator( &d->fields.last() + 1 );
460472
}
461473

462474
QgsFields::iterator QgsFields::begin()
463475
{
476+
if ( d->fields.isEmpty() )
477+
return iterator();
478+
464479
d.detach();
465480
return iterator( &d->fields.first() );
466481
}
467482

468483
QgsFields::iterator QgsFields::end()
469484
{
485+
if ( d->fields.isEmpty() )
486+
return iterator();
487+
470488
d.detach();
471489
return iterator( &d->fields.last() + 1 );
472490
}

tests/src/core/testqgsfields.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -494,6 +494,10 @@ void TestQgsFields::qforeach()
494494
void TestQgsFields::iterator()
495495
{
496496
QgsFields fields;
497+
498+
//test with empty fields
499+
QCOMPARE( fields.begin(), fields.end() );
500+
497501
QgsField field( QString( "1" ) );
498502
fields.append( field );
499503
QgsField field2( QString( "2" ) );
@@ -531,6 +535,17 @@ void TestQgsFields::iterator()
531535
void TestQgsFields::constIterator()
532536
{
533537
QgsFields fields;
538+
539+
//test with empty fields
540+
QCOMPARE( fields.constBegin(), fields.constEnd() );
541+
QCOMPARE( const_cast< const QgsFields* >( &fields )->begin(), const_cast< const QgsFields* >( &fields )->end() );
542+
Q_FOREACH ( const QgsField& f, fields )
543+
{
544+
Q_UNUSED( f );
545+
//should not be called!
546+
QVERIFY( false );
547+
}
548+
534549
QgsField field( QString( QString( "1" ) ) );
535550
fields.append( field );
536551
QgsField field2( QString( QString( "2" ) ) );

0 commit comments

Comments
 (0)