16.01.2014 Aufrufe

6 Race Conditions

6 Race Conditions

6 Race Conditions

MEHR ANZEIGEN
WENIGER ANZEIGEN

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!

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!