NI LabVIEW ist eine grafische Programmierplattform für die Datenerfassung, Gerätesteuerung und Testautomatisierung. Während Speichersicherheitslücken viele traditionelle Softwareumgebungen plagen, zeichnet sich LabVIEW durch Architektur und Designprinzipien aus. In diesem Whitepaper werden die Mechanismen und Funktionen untersucht, die LabVIEW zu einer speichersicheren Sprache (MSL) machen, wie diese Attribute im Vergleich zu herkömmlichen Programmiersprachen abschneiden, und die Implikationen für Entwickler, die robuste, zuverlässige und sichere Anwendungen suchen.
Speichersicherheit ist ein kritischer Aspekt der Softwaresicherheit und Zuverlässigkeit. Klassische Speichersicherheitsprobleme wie Pufferüberläufe, Use-after-free-Fehler und baumelnde Zeiger sind für einen erheblichen Teil der Softwarefehler und Sicherheitslücken in Programmiersprachen wie C und C++ verantwortlich.1 LabVIEW dagegen abstrahiert viele dieser Risiken durch seine datenflussgesteuerte grafische Umgebung auf hohem Niveau.
Speichersicherheit bezieht sich auf die Sicherheit, dass ein Programm in einer wohldefinierten, vorhersehbaren Weise auf Speicher zugreift. Diese Funktion verhindert Korruption, Datenlecks und das Schreiben von Daten außerhalb der vorgesehenen Grenzen. Diese Speicherprobleme können zu Abstürzen und undefiniertem Verhalten führen. Schlimmer noch: Bedrohungsakteure manipulieren Speicherprobleme, um beliebigen Programmcode auszuführen, wodurch Speicherfehler in erhebliche Sicherheitslücken umgewandelt werden. Bedenken hinsichtlich der Speichersicherheit umfassen die folgenden Arten von Problemen:
Sprachen, die direkten Speicherzugriff bieten (z. B. durch Zeiger), sind besonders anfällig für diese Probleme. Speichersichere Sprachen dagegen schränken die direkte Speicherverwaltung des Entwicklers ein oder abstrakten sie vollständig ab.
LabVIEW unterscheidet sich grundsätzlich von herkömmlichen befehlsorientierten Sprachen. Das grafische Programmierprinzip basiert auf Datenflussprinzipien, bei denen die Ausführung von Programmcode durch den Datenfluss zwischen Knoten (Virtuelle Instrumente oder VIs) bestimmt wird.
Folgende Aspekte der LabVIEW-eigenen Architektur fördern die Speichersicherheit:
In LabVIEW werden Programme erstellt, indem Funktionsblöcke mit datenführenden Verbindungen verbunden werden. Jeder Block wird nur ausgeführt, wenn alle erforderlichen Eingabedaten verfügbar sind, und auf Speicherstellen kann nicht zugegriffen werden, bevor die Daten erzeugt wurden, wodurch Laufzeitprobleme im Speicher vermieden werden.
Abbildung 1. LabVIEW Code-Beispiel
Dieses Modell vermeidet natürlich viele Programmierfehler, die durch die unsachgemäße Abfolge von Operationen in zwingenden Sprachen entstehen.
Für die gesamte Speicherzuweisung und -verteilung ist die LabVIEW Runtime Engine zuständig. Entwickler müssen niemals manuell Speicher anfordern oder freigeben, wodurch das Risiko von Lecks und Use-after-free-Fehlern vermieden wird. Wenn Arrays oder Cluster (strukturähnliche Daten) wachsen oder schrumpfen, verwaltet LabVIEW den zugehörigen Speicher transparent. Wenn ein Entwickler beispielsweise eine Schleife zum Erstellen eines Arrays erstellt, passt LabVIEW die Größe des Arrays automatisch an und verwaltet den zugehörigen Speicherplatz. Wenn die Array-Variable außerhalb des zulässigen Bereichs liegt, wird der Speicher von LabVIEW zurückgefordert.
Die LabVIEW Entwicklungsumgebung führt während der Kompilierung und Ausführung von VIs eine gründliche Typprüfung durch. Versuche, inkompatible Datentypen miteinander zu verbinden, werden während der Bearbeitung erkannt, wodurch Laufzeitfehler vermieden werden. Darüber hinaus enthalten Array- und String-Operationen Randprüfungen, um Pufferüberläufe zu verhindern.
Einer der wirksamsten Schutzmechanismen ist das Fehlen einer Low-Level-Speichersteuerung: LabVIEW bietet keine Möglichkeit für den Benutzer, eine beliebige Zeigerarithmetik durchzuführen oder direkt auf den Speicher zuzugreifen. Dadurch sind in C oder Assembly übliche Sicherheitslücken wie Stack- oder Heap-Überläufe im systemeigenen LabVIEW Code nicht möglich.
Um die Speichersicherheit von LabVIEW besser zu verstehen, empfiehlt sich der Vergleich mit Programmiersprachen wie C, C++ und sogar Java oder Python.
Zusammenfassend lässt sich sagen, dass LabVIEW ganze Kategorien von speicherbezogenen Schwachstellen (z. B. Pufferüberläufe) eliminiert und die sichere Entwicklung von Anwendungen vereinfacht, was einen erheblichen Vorteil gegenüber traditionellen Sprachen wie C und C++ bietet und einen ähnlichen Schutz wie Python und Java ermöglicht.
Speichersicherheit in LabVIEW hat für Entwickler, Organisationen und Endnutzer spürbare Vorteile:
Traditioneller Pufferüberlauf tritt auf, wenn Daten die Grenzen eines Puffers fester Länge überschreiten, wodurch benachbarter Speicher überschrieben wird und möglicherweise willkürlicher Programmcode ausgeführt werden kann. In LabVIEW werden Array- und String-Operationen immer auf Grenzen geprüft. Versuche, über das Ende eines Arrays oder Strings hinaus zu schreiben, führen zu einem Laufzeitfehler und nicht zu einer Speicherbeschädigung.
Wie in jeder speichersicheren Umgebung ist es wichtig, die Grenzen von LabVIEW zu verstehen:
Gehen Sie zum Maximieren der Sicherheit beim Aufrufen von externem Programmcode wie folgt vor:
LabVIEW basiert auf einem grafischen Datenflussprinzip, einer starken Typprüfung, automatischer Speicherverwaltung und dem Fehlen direkter Zeigerbearbeitung. Entwickler profitieren von reduziertem Risiko von speicherbedingten Fehlern, erhöhter Produktivität und der Möglichkeit, Anwendungen für anspruchsvolle, sicherheitskritische Branchen mit Vertrauen zu erstellen.
Obwohl keine Umgebung vor Fehlern gefeit ist – insbesondere bei der Interaktion mit unsicheren externen Komponenten – legt LabVIEW die Messlatte für die Speichersicherheit gegenüber herkömmlichen befehlsorientierten Sprachen deutlich höher. Für Unternehmen, die Zuverlässigkeit und Sicherheit in Mess-, Automatisierungs- und Steueranwendungen suchen, ist LabVIEW eine überzeugende Wahl für die speichersichere Entwicklung.
| Aspekt | C/C++ | Python/Java | LabVIEW |
|---|---|---|---|
| Speicherzugriff | Direkter Speicherzugriff | Kein direkter Speicherzugriff | Kein direkter Speicherzugriff |
| Speicherverwaltung | Manuelle Speicherverwaltung, fehleranfällig | Automatische Speicherverwaltung | Automatische Speicherverwaltung |
| Fehleranfälligkeit | Hohes Risiko von Speichersicherheitsfehlern (z. B. Pufferüberlauf) | Deutlich reduziertes Risiko durch strikte Typisierung und verwalteten Speicher | Deutlich reduziertes Risiko durch strikte Typisierung und verwalteten Speicher |
| Zeiger | Umfangreicher Einsatz von Zeigern, Erhöhung der Komplexität und des Risikos | Keine direkte Verwendung von Zeigern | Keine direkte Verwendung von Zeigern |
| Sicherheit | Hohe Angriffsfläche durch manuelle Speicherbehandlung und Anfälligkeit für Pufferüberläufe | Minimale Angriffsfläche, immun gegen Pufferüberläufe und Zeiger-Exploits | Minimale Angriffsfläche, immun gegen Pufferüberläufe und Zeiger-Exploits |
1 "Speichersichere Sprachen: Reducing Vulnerabilities in Modern Software Development, Cybersecurity and Infrastructure Agency, Juni 2025, https://www.cisa.gov/resources-tools/resources/memory-safe-languages-reducing-vulnerabilities-modern-software-development.
Java ist eine eingetragene Marke von Oracle und/oder seinen verbundenen Unternehmen. Andere Namen können Marken der jeweiligen Inhaber sein.