Für Linux 5.18 ist geplant, den Code auf eine aktuellere Version von C zu verschieben, um verschiedene Probleme zu lösen. 

Was ist Linux und wozu dient es?

Während des Prozesses von Entwicklerdiskussion des Linux-Kernels über undl Thema einer Reihe von Patches zur Behebung von Schwachstellen von Spectre im Code, um mit verknüpften Listen zu arbeiten, es wurde klar für viele Entwickler ist das das Problem könnte einfacher gelöst werden, wenn im Kernel-Code erlaubt war C que entspricht einer neueren Version der Norm. 

Und es ist so, dass der dem Linux-Kernel hinzugefügte Code derzeit der Spezifikation ANSI C (C89) entsprechen muss, die 1989 gegründet wurde.

Darum das Problem im Zusammenhang mit Spectre im code war da sWir haben weiterhin einen Iterator verwendet separat nach der Schleife definiert.

Trotz seiner allgemein schnellen Natur stützt sich das Kernel-Projekt auf eine Reihe älterer Tools. Während sich Kritiker gerne auf die umfangreiche Verwendung von E-Mail durch die Community konzentrieren, ist ein möglicherweise bedeutenderer Anachronismus die Verwendung der 1989er Version des C-Sprachstandards für Kernel-Code, ein Standard, der kodifiziert wurde, bevor das Kernel-Projekt vor über 30 Jahren begann. Es sieht so aus, als könnte diese langjährige Praxis bereits mit dem im Mai dieses Jahres erwarteten Kernel 5.18 ein Ende haben.

Es wird das erwähnt ein Makro wird verwendet, um über die Elemente der verknüpften Liste zu iterieren, und da der Schleifeniterator an dieses Makro übergeben wird, wird er außerhalb der Schleife selbst definiert und bleibt nach der Schleife verfügbar. Die Verwendung des C99-Standards würde es Entwicklern ermöglichen, Variablen für die Schleife im for()-Block zu definieren, was das Problem lösen würde, ohne Workarounds zu erfinden.

Leider gibt es im Kernel mehrere Stellen, an denen die list
Iterator wird nach der Schleife verwendet, die bei einer solchen Änderung unterbrochen wird. Glücklicherweise
Es gibt das Skript use_after_iter.cocci, mit dem solche identifiziert werden können
Code-Standorte. Ich musste das Skript etwas anpassen, da es false reduziert
Positive im ursprünglichen Anwendungsfall, aber diese sind für diesen Patch relevant.

Eine Vielzahl von gemeldeten Codepositionen verwenden den Listeniterator nur danach
der Zyklus, wenn es einen frühen Ausstieg (break/goto) gab und sie es daher nicht sind
relevant.

Für seinen Teil, Linus Torvalds stimmte der Idee zu um Unterstützung für die neueren Spezifikationen implementieren zu können, und schlug ferner vor, auf Kernel 5.18 umzusteigen, um den 11 veröffentlichten C2011-Standard zu verwenden.

Danach wurde während der vorläufigen Überprüfung das Mounten auf GCC und Clang im neuen Modus ohne Abweichung bestanden. Sofern nicht aufgrund umfangreicherer Tests unvorhergesehene Probleme auftreten, ändern die 5.18-Kernel-Build-Skripte die Option „–std=gnu89“ in „–std=gnu11 -Wno-shift-negative-value“.

Linus Torvalds mochte den Patch nicht sehr und sah nicht, wie er mit spekulativen Ausführungsschwachstellen zusammenhängt. Nachdem Koschel die Situation weiter erläutert hatte, stimmte Torvalds jedoch zu, dass „dies nur ein normaler Fehler ist, schlicht und einfach“ und sagte, dass er unabhängig von der größeren Serie behoben werden sollte. Aber dann kam er zur eigentlichen Ursache des Problems: dass der Iterator, der an die Makros zum Durchlaufen der Liste übergeben wurde, in einem Gültigkeitsbereich außerhalb der Schleife selbst deklariert werden muss:

Der Hauptgrund, warum diese Art von nicht spekulativen Fehlern auftreten kann, ist, dass wir in der Vergangenheit keine „Variablen in Schleifen deklarieren“ im C99-Stil hatten. list_for_each_entry() - und alle anderen - filtern also grundsätzlich immer den letzten HEAD-Eintrag aus der Schleife heraus, einfach weil wir die Iterator-Variable nicht in der Schleife selbst deklarieren konnten.

Erwähnenswert ist auch das die Möglichkeit der Verwendung des C17-Standards wurde in Betracht gezogen, In diesem Fall wäre es jedoch erforderlich, die minimal unterstützte Version von GCC zu erhöhen, da die Aufnahme der Unterstützung für C11 den aktuellen Anforderungen für die GCC-Version (5.1) entspricht.

Schließlich wenn Sie mehr darüber wissen möchtenkönnen Sie die Details in der überprüfen folgenden Link


Hinterlasse einen Kommentar

Ihre E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert mit *

*

*

  1. Verantwortlich für die Daten: AB Internet Networks 2008 SL
  2. Zweck der Daten: Kontrolle von SPAM, Kommentarverwaltung.
  3. Legitimation: Ihre Zustimmung
  4. Übermittlung der Daten: Die Daten werden nur durch gesetzliche Verpflichtung an Dritte weitergegeben.
  5. Datenspeicherung: Von Occentus Networks (EU) gehostete Datenbank
  6. Rechte: Sie können Ihre Informationen jederzeit einschränken, wiederherstellen und löschen.