Die unsicheren Module der Standardbibliothek

Ein Modul ist unsicher, wenn in seinem Rumpf pragma Unsafe_Module; steht. Nur ein unsicheres Modul darf eine C-Funktion binden (pragma Foreign_Import), C in das Programm einbetten (@embed) oder Hilde.Memory importieren, das eingebaute Modul für Adressen und rohen Speicher. Ein sicheres Modul darf nichts davon, und der Compiler achtet darauf.

Die Module, die ein Programm importiert, sind sicher. Jeder Aufruf der Standardbibliothek nach C steckt in einem der Module unten, und ein Programm kann keines davon importieren: Ein Bindings.-Modul darf nur ein Modul importieren, dessen Name mit Standard. oder Bindings. beginnt (Fehler H2045). Jedes Binding erklärt am Anfang kurz, was es bindet und welches sichere Modul darauf aufbaut.

Die Bindings

Modulbindetwarum es unsicher istdas darauf gebaute sichere Modul
Bindings.Libcryptolibcrypto (LibreSSL oder OpenSSL)Zwischenpuffer, die EVP-Aufrufe und RAND_bytes, mit AdressenStandard.Libcrypto
Bindings.MlDsaML-DSA nach FIPS 204 aus libcrux, dem C, das der Compiler mitführtdie Adressen von Schlüsseln, Nachricht, Kontext, Zufallswerten und der Puffer, in die die Ergebnisse geschrieben werden, mit den festen Größen von FIPS 204Standard.MlDsa
Bindings.Argon2libargon2, die Referenzimplementierung von Argon2der Puffer, in den der Tag geschrieben wird, die Adressen von Passwort, Salt, Secret und Daten und der Kontext, aus dem die Bibliothek sie liestStandard.Password
Bindings.Bcryptdie Prüfung eines bcrypt-Hashes über die Laufzeit: crypt_checkpass der libc von OpenBSD, crypt_rn von libxcrypt unter Linux, crypt_r von libcrypt unter FreeBSDAufrufe in die Laufzeit mit @embedStandard.Password
Bindings.Tlslibtls sowie das Warten der Laufzeit auf einen Socket und ihre monotone Uhrdie beiden Handles einer Client-Verbindung, die Puffer eines Sendens und eines Empfangens und die Nummer des Sockets, auf den gewartet wirdStandard.Tls
Bindings.PcrePCRE2 und sein JIT für Standard.PcreJitein kompiliertes Muster, die Treffer-Slots und der JIT-Stack einer SucheStandard.Pcre
Bindings.SqliteSQLitedie Verbindung, ihre Statements, die übergebenen und ausgelesenen Werte, die MigrationenStandard.Sqlite
Bindings.SqlCipherSQLCipherwie Bindings.Sqlite, mit dem SchlüsselStandard.SqlCipher
Bindings.SqliteReplicaSQLitedie Verbindung, Statements, die aus erst zur Laufzeit bekanntem Text vorbereitet werden, die gebundenen Werte und die herauskopierten Spalten, die Online-Sicherung in eine Datei und aus einer DateiStandard.SqliteReplica
Bindings.Postgreslibpq, die Client-Bibliothek von PostgreSQLdie Verbindung, ihre Ergebnisse, die an PQexecParams übergebenen Arrays von Werten, Typen, Längen und Formaten und die aus einem Ergebnis gelesenen BytesStandard.Postgres
Bindings.MariaDBlibmariadb, MariaDB Connector/Cdie Verbindung, ihre vorbereiteten Statements, die MYSQL_BIND-Arrays von Werten und Spalten und der C-Speicher, auf den sie zeigen, und die Optionen der Verbindung, geschrieben in @embed gegen mysql.hStandard.MariaDB
Bindings.DuckDBlibduckdb, der Release-Build von DuckDBdie Datenbank, ihre Verbindung und Konfiguration, vorbereitete Statements, Ergebnisse und Datenblöcke, die Slots von Ausgabeparametern und Werte, die in @embed gegen duckdb.h als Wert übergeben werdenStandard.DuckDB
Bindings.Databasenichts von außen: abandon und die Box Erased mit erase, unerase, reveal und revealWritees beendet das Programm mit einem linearen Wert, der nicht mehr auf die richtige Weise beendet werden kann; es hält die Verbindung, Transaktion oder den Cursor eines Treibers in einer Box aus Bytes und wandelt sie zurück in den Typ, den der Treiber nennt, was nur das Treibermodul tut, das sie gelöscht hat: Standard.Database.Sqlite, .Postgres und .MariaDBStandard.Database
Bindings.Arraynichts von außen: die Byte-Reihenfolge von Zahlen, in einfachem Cdie Adresse eines Spans und ein Byte-Offset darin, gelesen oder geschrieben als Int32, Int64, Float32 oder Float64 mit @embedStandard.Array
Bindings.Timedie Uhren der C-Bibliothek, über die LaufzeitAufrufe in die Laufzeit mit @embedStandard.Time
Bindings.BuildInfonichts von außen: die Makros und die Wertetabelle, die der Compiler in ein Programm schreibt, das dieses Modul kompiliertSpans, die aus den Adressen dieser C-Strings gebildet werden, mit @embedStandard.BuildInfo
Bindings.Platformgethostname(3), einmal gefragt und behalten; außerdem zwei Funktionen der Laufzeit, die aus den Makros des C-Compilers antwortenSpans, die aus den Adressen dreier C-Strings gebildet werden, mit @embedStandard.Platform
Bindings.Bitsnichts außerhalb des Programms: eine C-Union liest die Bits einer binary64- oder binary32-Zahl oder einer Zweierkomplement-Ganzzahl als vorzeichenlose Zahl derselben Breiteacht Ausdrücke mit @embed über ein Union-Compound-Literal, kein Speicher und kein ZeigerStandard.Bits
Bindings.Secretdas Terminal des Prozesses mit abgeschaltetem Echo (readpassphrase auf den BSDs und macOS, termios unter Linux) und die Standardeingabe, über die Laufzeitein Puffer von 1024 Bytes vom Allokator, dessen Adresse an die Laufzeit übergeben und vor dem Freigeben überschrieben wirdStandard.Secret
Bindings.Accountdie Passwortdatenbank über getpwnam_r(3) und geteuid(2), über die Laufzeitein Name, kopiert in einen Puffer von 256 Bytes auf dem Stack der Laufzeit, abgewiesen, wenn er länger ist oder ein Nullbyte enthältStandard.Account
Bindings.Resolveder Resolver der C-Bibliothek, getaddrinfo, über die Laufzeitder Puffer, in den die Laufzeit die Adressen schreibt, und Aufrufe in die Laufzeit mit @embedStandard.Resolve
Bindings.Terminaldie Standardströme der C-Bibliothek, ein ganzer Text, der mit write(2) auf die Standardfehlerausgabe geschrieben wird, sowie Echo, Breite und anstehende Eingabe des Terminals, über die LaufzeitAufrufe in die Laufzeit und die Adresse der Bytes des TextesStandard.IO.Terminal
Bindings.SystemLogdas Systemlog, openlog, syslog und closelog, über die Laufzeitdie Adressen der Bytes von Name und Text und Aufrufe in die Laufzeit mit @embedStandard.Log
Bindings.Signalder Signalhandler der Laufzeit und seine Pipe, sigaction, kill, alarm und getpidAufrufe in die Laufzeit mit @embedStandard.Signal
Bindings.Arenadie Arena der Laufzeit, Speicher vom Kerneldas Handle der Arena sowie Referenzen und Spans, die aus ihren Adressen gebildet werdenStandard.Arena
Bindings.Pollerder Poller der Laufzeit, epoll unter Linux und kqueue unter OpenBSD, FreeBSD und macOSdas Handle des Pollers und seine AufrufeStandard.Poller
Bindings.Taskdie Fibers, Scopes und Channels der Laufzeit, auf Threads des Prozessesdas Argument und das Ergebnis eines Tasks und die Werte eines Channels, in rohem SpeicherStandard.Task
Bindings.Shareddie Mutexe der Laufzeit, die einen wartenden Task parken, und ihre atomaren Operationen auf einem Wort von 64 Bitder Wert, den ein Mutex schützt, in einer rohen Zelle, über eine Lese-Referenz hinaus- und zurückbewegt, und das WortStandard.Shared
Bindings.Filedie Datei-, Verzeichnis-, Prozess-, Umgebungs- und Socket-Aufrufe der C-Bibliothek, darunter eine TCP-Verbindung sowie Lesen und Schreiben auf einem Socket mit Zeitlimit, Status, Besitzer, Umbenennen, Link und Sync einer Datei und eine temporäre Datei, über die Laufzeitdie Adressen der Bytes von Pfaden, Puffern und Netzwerkadressen sowie ein VerzeichnisstromStandard.File
Bindings.Sandboxpledge mit seinen execpromises, unveil und der Kindprozess, das unter OpenBSD seinen Platz misst, no new privileges, Landlock und seccomp unter Linux, das Seatbelt-Profil und der Start unter sandbox-exec unter macOS, Capsicum unter FreeBSD, über die Laufzeitdie Adressen der Bytes von Promises, Pfaden und BerechtigungenStandard.Sandbox
Bindings.Serialein Zähler, der vom ganzen Prozess geteilt und in C gehalten wirdAufrufe nach C mit @embedStandard.Graph
Bindings.Resourcegetrlimit, setrlimit und getrusage sowie die Uhr, die ab dem Systemstart zählt, über die Laufzeitein Puffer von Slots, in den die Laufzeit die Zahlen schreibt, und Aufrufe in die Laufzeit mit @embedStandard.Resource
Bindings.Watchinotify unter Linux und kqueue unter OpenBSD und FreeBSD, über die Laufzeitdie Adresse der Bytes eines Pfades und Aufrufe in die Laufzeit mit @embedStandard.Watch
Bindings.Contexteine Pipe der Laufzeit und die Kette von Leseenden der Laufzeit mit einem Referenzzähler je Ebene, auf die sie mit poll wartetdie Adresse einer Ebene der Kette und Aufrufe nach C mit @embedStandard.Context
Bindings.X509die Schlüssel, X.509-Zertifikate und -Anfragen, PEM und DER sowie die Prüfung einer Kette von libcrypto, aufgerufen in @embed gegen die Header des Systems, die Funktionen, die Bindings.C.Libcrypto importiert, darüber aufgerufen, und die beiden mit dlsym gefundenen Funktionen von ML-DSAMemory-BIOs, die Slots von Ausgabeparametern, die Puffer von Signaturen und DER und die Handles von Schlüsseln und ZertifikatenStandard.X509
Bindings.Entropygetentropy, für die Schlüssel von Hash-Mapsein Aufruf nach C mit @embedStandard.HashMap
Bindings.Testingdie Frage der Laufzeit, ob das Programm unter valgrind läuft, die nur ein Build von hilde test --valgrind valgrind stelltein Aufruf in die Laufzeit mit @embedStandard.Testing

Die Deklarationen von C

Diese Module werden aus einer Spezifikation erzeugt. Sie enthalten die C-Funktionen und -Konstanten einer Bibliothek so, wie ihr Header sie deklariert, mit Adresstypen. Nur die Bindings oben benutzen sie.

Modulbenutzt von
Bindings.C.LibcryptoBindings.Libcrypto
Bindings.C.TlsBindings.Tls
Bindings.C.Pcre2Bindings.Pcre
Bindings.C.Sqlite3Bindings.Sqlite, Bindings.SqliteReplica
Bindings.C.SqlCipherBindings.SqlCipher
Bindings.C.LibpqBindings.Postgres
Bindings.C.MariadbBindings.MariaDB
Bindings.C.DuckdbBindings.DuckDB
Bindings.C.Argon2Bindings.Argon2
Bindings.C.Probeniemand: der eigene Test des Generators, über libm
Bindings.C.ProbePPniemand: der eigene Test des Generators, über libm

In den Compiler eingebaut

Drei Module sind fest in den Compiler eingebaut und werden nicht aus der Standardbibliothek gelesen. Hilde.Pervasive ist das Prelude, das jedes Modul sieht; sein spanPart prüft den verlangten Ausschnitt, bevor es einen Span daraus macht. Hilde.Memory enthält Adressen, Zeiger und rohen Speicher, und nur ein unsicheres Modul darf es importieren (Fehler H2028). Hilde.Array ist das Array auf dem Heap: Jede seiner Operationen prüft Index oder Span und hält das Programm mit einer Meldung an, wenn er außerhalb des Bereichs liegt. Deshalb darf auch ein sicheres Modul es importieren; Standard.Buffer und Standard.Box bauen darauf auf.