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.

In Pocket speichern vorlesen Druckansicht 50 Kommentare lesen
GSL 3 für C++ Core bringt Implementierungen für gsl::span und mehr CMake-Support

(Bild: Proxima Studio/Shutterstock.com)

Lesezeit: 4 Min.
Von
  • Silke Hahn
Inhaltsverzeichnis

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.

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.

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.

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)