2015-04-23 8 views
9

Ich versuche, eine Funktion aus einer Open Source-Bibliothek zu verwenden. Diese Funktion wird standardmäßig nicht von außen offen gelegt (daher nehme ich an, dass es sich nicht um eine direkt von der Open Source Bibliothek bereitgestellte Funktion handelt), aber ich brauche diese Funktion, um ein Problem in meinem Code zu lösen, also habe ich einige Änderungen in Makefile vorgenommen Funktion aus der Bibliothek.So finden Sie, ob eine Funktion reentrant ist

Jetzt ist die Frage, wie Sie sicherstellen, dass diese Funktion einspringt.

Ich bin nicht in der Lage, mit dem bloßen Auge herauszufinden, weil es eine Reihe von Funktionen intern aufruft.

Um genau zu sein Ich bin neugierig zu wissen, ob es ein Werkzeug zur Verfügung oder eine Option in GDB zu prüfen, ob meine Funktion nur lokale Variablen und es ändert keine globalen Variablen.

+6

Wenn Sie sich unsicher sind und Änderungen vornehmen können (so wie es aussieht), stellen Sie die Funktion nicht mit statischen Mutex ein. –

+1

können Sie den disassemblierten Code überprüfen. es ist aber wahrscheinlich nicht die Mühe wert ... –

+0

Sie könnten einfach die Funktion aufrufen und einen Interrupt aufrufen und die Funktion erneut aufrufen und sehen, was passiert. Wenn es sich schlecht verhält. –

Antwort

1

Der Weg, um festzustellen, ob eine Funktion reentrant ist, besteht darin, zu analysieren, was sie tut.

1) Es greift nicht auf Globals zu, es sei denn, die Operationen auf diesen Globalen sind atomar (z. B. gibt es keine Möglichkeit, gleichzeitig global zu lesen und zu modifizieren). Dies bedeutet gewöhnlich, die Verwendung von Globals zu vermeiden oder einen synchronisierten Zugriff auf diese zu garantieren - z. Der gesamte Code, der ein globales ändert und liest, enthält einen Mutex bis zum Ende, so dass die Operationen serialisiert werden. Oder Code th

2) Der Code ist nicht selbstmodifizierend (glücklicherweise ist selbstmodifizierender Code in Standard C oder C++ relativ selten).

3) Es ruft keine anderen Funktionen auf, die keine Wiedereintrittsfunktionen sind (die eine beträchtliche Anzahl von Funktionen in der Standardbibliothek enthalten) oder Programme (z. B. Multiprozessing kompliziert normalerweise die Kontrolle, um Wiedereintritt zu gewährleisten).

Mir ist kein spezielles Werkzeug bekannt, um eine Funktion zur Bestimmung der Reentranz zu analysieren. In der Regel ist eine Funktion so konzipiert, dass sie reentrant ist (oder nicht). Wenn es in der Praxis keine Dokumentation gibt, die besagt, dass eine Funktion für die Wiedereingliederung konzipiert wurde, ist es eine faire Wette, dass sie nicht reentrant ist.

Verwandte Themen