Rainer Grimm hat am 6. September 2019 in seinem Blog Modernes C++ die Profile der C++ Core Guidelines vorgestellt. Profile sind Teilmengen der Regeln, die jeweils einen einzelnen Aspekt absichern: Type Safety, Bounds Safety und Lifetime Safety. Über die Guidelines Support Library lassen sich genau diese Aspekte im Code prüfen.
Grimm nennt zwei Gründe für den Aufbau in Profile. Teams mit Altcode können nicht alle Regeln der Core Guidelines in einem Schritt anwenden und führen sie deshalb stufenweise ein. Außerdem sind bestimmte Regelgruppen für eine Codebasis wichtiger als andere, etwa die Vermeidung von Zugriffsfehlern oder die korrekte Verwendung von Datentypen. Die formale Definition der Guidelines beschreibt ein Profil als Menge deterministischer und portabel durchsetzbarer Teilmengeregeln mit einer bestimmten Garantie. Deterministisch bedeutet, dass sich die Regel lokal analysieren und im Compiler umsetzen lässt. Portabel durchsetzbar heißt, dass verschiedene Werkzeuge auf verschiedenen Plattformen zum selben Ergebnis kommen. Ein Code erfüllt ein Profil, wenn er bezogen auf dieses Profil keine Warnung mehr liefert.
Drei Profile mit eigener Aufgabenstellung
Das Profil Type Safety verlangt den korrekten Umgang mit Typen und vermeidet unsichere Casts und Unions. Das Profil Bounds Safety hält Zugriff und Arithmetik innerhalb der Grenzen zugeordneten Speichers und trifft damit dieselbe Fehlerklasse wie Pufferüberläufe, gegen die Microsoft 2016 bereits Checked C für C-Code vorgelegt hatte. Das Profil Lifetime Safety schließlich verlangt, dass niemals ein möglicher ungültiger Zeiger dereferenziert wird. Zusätzlich zu den drei bestehenden Profilen wollen die Core Guidelines künftig weitere Profile für undefiniertes und unspezifiziertes Verhalten definieren.
Ausflug zu undefiniertem und unspezifiziertem Verhalten
Vor der Detailarbeit an den Profilen trennt Grimm die beiden Begriffe nach dem damaligen C++20-Entwurf. Undefiniertes Verhalten liegt vor, wenn das Dokument keinerlei Anforderungen stellt; das Ergebnis kann richtig, falsch oder ein Absturz sein und hängt von Plattform, Compiler, Version und Optimierungsstufe ab. Typische Beispiele sind Zugriff außerhalb von Containern, uninitialisierte Variablen, Dereferenzierung eines Nullzeigers, Division durch Null und eine undefinierte Auswertungsreihenfolge. Unspezifiziertes Verhalten dagegen hängt bei einem wohlgeformten Programm mit korrekten Daten von der Implementierung ab, etwa bei der Reihenfolge der Auswertung von Funktionsargumenten. Details zur Auswertungsordnung auf cppreference.com.

An einem kleinen Programm zeigt Grimm den Unterschied: Ausdrücke wie myArr[i] = i++ sind mit C++14 undefiniertes Verhalten, weil die Teilausdrücke innerhalb der Vollauswertung nicht sequenziert sind; mit C++17 ist dasselbe Konstrukt nur noch unspezifiziert, weil jeder Argumentausdruck vor dem anderen vollständig ausgewertet wird, die Reihenfolge aber weiter offenbleibt. Clang meldet die Stellen mit selbsterklärenden Warnungen. Grimms Konsequenz ist eindeutig: Undefiniertes Verhalten gehört repariert, nicht umgangen.
Prüfbar für Qualitätssicherung und Compiler
Für die Praxis der Spiele- und Softwareentwicklung entscheidet die Eigenschaft deterministisch: Weil sich die Profilregeln lokal analysieren lassen, können Compiler und statische Analysetools sie durchsetzen, ohne das gesamte Programm verstehen zu müssen. Die Guidelines Support Library von Microsoft stellt dafür Header-only-Werkzeuge im Namespace gsl bereit, darunter die in Grimms Beitrag genannten Mechanismen zur Prüfung der drei Profile. Für Teams bedeutet das: Profile geben eine Reihenfolge vor, in der unsichere Codebereiche abgearbeitet werden können, und liefern über Warnfreiheit ein messbares Kriterium für die Qualitätssicherung.
Grimm kündigt in dem Beitrag an, die drei Profile Type Safety, Bounds Safety und Lifetime Safety in den folgenden Artikeln seines Blogs im Detail zu behandeln. Für Teams, die die Regeln schrittweise einführen, bleibt damit ein klarer Pfad: erst ein Profil wählen, den Code warnenfrei machen, dann das nächste Profil angehen.

