Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
212<br />
10 <strong>Race</strong> <strong>Conditions</strong><br />
Frage 10.2:<br />
Frage 10.3:<br />
Sie wollen einen Embedded-Webserver auf Data <strong>Race</strong>s testen. Jede<br />
Client-Session des Servers läuft als eigener Thread und benutzt u.a.<br />
Shared-Variablen. Der Quellcode des Servers liegt Ihnen vor und<br />
enthält mehrere Verzweigungen. Sie haben ihn mit einem dynamischen<br />
Werkzeug basierend auf Happens-Before-Relationen instrumentiert<br />
und gestartet. Als Testumgebung starten Sie mehrere Client-Sessions<br />
über Webbrowser und klicken ein wenig in den<br />
angezeigten Seiten herum. Das Werkzeug meldet keine Fehler.<br />
Wochen später entdecken Sie eine <strong>Race</strong> Condition. Nennen Sie<br />
zumindest zwei Gründe, warum so eine <strong>Race</strong> Condition durch<br />
Ihren Test nicht erkannt wurde. Nennen Sie zuerst den objektiv<br />
wahrscheinlichsten Grund!<br />
Sie testen einen Echtzeitbetriebssystem-Kernel auf Data <strong>Race</strong>s.<br />
Dazu ersetzen Sie den Rumpf der Funktionen interrupt_disable()<br />
und interrupt_enable() durch locking und unlocking, wie in<br />
Abschnitt 10.5 vorgeschlagen. Der Kernel hat einen ganz gravierenden<br />
Design-Fehler: Eine Funktion ruft in ihrer mit<br />
interrupt_disable() und interrut_enable() geschützten Critical<br />
Section eine andere Funktion auf, die wieder eine Critical Section<br />
auf diese Art schützt. Beim Aufruf des ersten interrut_enable()<br />
ist aber der Schutz vorbei. Würde so ein Fehler durch ein Data-<br />
<strong>Race</strong>-Detection-Tool erkannt werden? Wenn nicht, was kann<br />
man tun, damit er erkannt wird?<br />
Aufgabe 10.4: Sie wollen einen Protokoll-Stack auf Data <strong>Race</strong>s prüfen. Sie<br />
haben eine Testumgebung, die alle Operationen in ihrer Gesamtheit<br />
mit 100% Decision Coverage ausführt. Als einziger Synchronisationsmechanismus<br />
kommt im Protokoll-Stack Locking zum<br />
Einsatz. Aus Effizienzgründen sind sogenannte Read-Before-<br />
Lock-Sequenzen im Code zu finden:<br />
if (shared_var == expected_value) /* no lock to be fast */<br />
{<br />
/* unlikely case: now use the lock for RMW */<br />
RTOS_Lock(mtx_for_shared_var);<br />
if (shared_var == expected_value)<br />
{<br />
shared_var = foo(shared_var);<br />
}<br />
RTOS_Unlock(mtx_for_shared_var);<br />
}<br />
Wie wird Eraser bei solchen Code-Teilen reagieren, wenn Sie Eraser<br />
einsetzen, um nach Data <strong>Race</strong>s zu suchen? Schreiben Sie den<br />
Code so um, dass Eraser sinnvoll eingesetzt werden kann!