C++ Core Guidelines: GSL 3 bringt Anpassungen für C++20
Durch die neuen Implementierungen von gsl::span gleicht sich Microsofts Guideline Support Library weiter dem neuen C++20-Standard an.
- Silke Hahn
Microsoft hat die Guideline Support Library (GSL) für C++20 in Version 3.0 veröffentlicht. Das Release enthält weitere Elemente zum Implementieren von gsl::span
und gsl::span_iterator
, die sich am C++20-Standard orientieren, zusätzliche CMake-Unterstützung und Änderungen beim Verhalten im Falle von Contract-Verstößen. Die Elemente gsl::multi_span
und gsl::strided_span
gelten ab sofort als veraltet.
Standardisierung und Angleichungen
Die Standardisierung von span
nähert sich dem Abschluss, folgerichtig umfasst das Release daran angepasste neue Implementierungen. Die Neuerungen bieten vollständiges Überprüfen der Speichergrenzen (Bounds Checking) und sollen dadurch Bounds Safety garantieren, wenn die zugrundeliegende Daten gültig sind. Microsoft hat gsl::span
umgeschrieben und die Schnittstelle an die von std::span
angepasst. Die größte Änderung hierbei ist wohl, dass der Extent von span
nun unsigned ist. Version 3.0 der GSL implementiert span
als std::size_t
(vorher std::ptrdiff_t
).
Die Entwickler der Bibliothek haben das Interface laut Release Notes dem neuen Standard weiter angepasst. Um gsl::span
der Schnittstelle von std::span
anzugleichen, entfallen folgende Funktionen: span::operator()
, span::at
, span::cbegin
, span::cend
, span::crbegin
, span::crend
. Das Element span::as_writeable_bytes
haben sie umbenannt zu span::as_writable_bytes
(ohne Binnen-e bei writable). Ergänzt haben sie die Elemente span::front
und span::back
.
Unterschiede für C++ 20 und ältere Versionen
Je nach verwendeter C++-Version empfiehlt Microsoft unterschiedliche Operatoren: Entwickler, die den C++20-Modus aktiviert haben und keine Bounds Safety zur Laufzeit benötigen, können standardmäßig den in Visual Studio 2019 16.6 mitgelieferten Operator std::span
verwenden. Wer auf C++14 oder C++17 oder Bounds Safety benötigt, sollte auf gsl::span
zurückgreifen.
Auch am gsl::span_iterator
hat Microsoft Änderungen vorgenommen, so ist die Implementierung für span_iterator
komplett überarbeitet und soll nun den in C++20 eingeführten Ranges ähnlicher sein. Die neue Version sei ein Set aus drei Pointern: begin
, end
und current
. Ein Vorteil soll sein, dass die neue Implementierung die Überprüfung der Bounds eigenständig durchführen könne, ohne Umweg über einen span
-Aufruf. Die Pointer verweisen nun direkt auf die zugrunde liegenden Daten statt auf die Spanne, und der neue Zeiger span_iterator
könne die darunter liegende Spanne überdauern. Eine Reihe von Elementen haben die GSL-Enwickler von <gsl/span>
nach <gsl/span_ext>
übersiedelt, eine Auflistung findet sich in den Release Notes.
Contract Violation Behaviour ist wohl neuerdings nicht mehr konfigurierbar, sondern führt nun stets zur Beendigung von Prozessen. Diese Neuerung ist nicht unumstritten und könnte in Zukunft erneut aufgehoben werden. Interessierte können auf GitHub an der Diskussion teilnehmen ("Clarification requested Issue #1561").
Das Release unterstützt find_package
. Nach der Installation sollen Entwickler, die mit CMake arbeiten, mit dem Befehl find_package(Microsoft.GSL CONFIG)
die GSL einbinden können. Weitere Änderungen betreffen potentielle Build-Brüche und Mitigations, die Release Notes enthalten eine Auflistung.
Was ist die Guideline Support Library?
Die Guideline Support Library (GSL) ist eine kleine Bibliothek, die die Regeln der C++ Core Guidelines umsetzt. Sie soll es Entwicklern ermöglichen, besseren C++-Code zu schreiben. Der Fokus liegt dabei auf der Speicher- und Typsicherheit, die bekannteste Implementierung ist von Microsoft und lässt sich bei GitHub herunterladen. Mehr Informationen zu den Neuerungen lassen sich den Release Notes entnehmen.
In einer Serie von Blogartikeln auf heise Developer informiert Rainer Grimm regelmäßig über Modernes C++, so auch über die C++ Core Guidelines und ihre Support Library. (sih)