Komponententest für fehlgeschlagenes malloc ()

8

Was ist der beste Weg zum Testen von Code-Pfaden, die einen fehlgeschlagenen malloc() beinhalten? In den meisten Fällen ist es wahrscheinlich egal, weil Sie etwas wie

tun %Vor%

Aber in einigen Fällen haben Sie andere Wahlmöglichkeiten als zu sterben, weil Sie etwas zusätzliches Material für das Caching oder was auch immer zugewiesen haben, und Sie können diese Erinnerung zurückgewinnen.

In solchen Fällen, in denen Sie versuchen können, sich von einem fehlgeschlagenen malloc() zu erholen, tun Sie etwas Schwieriges und Fehlerhaftes in einem Code-Pfad, der ziemlich ungewöhnlich ist, was das Testen besonders wichtig macht. Wie gehst du eigentlich dazu?

    
Pillsy 10.11.2009, 21:04
quelle

6 Antworten

15

Ich sah eine kühle Lösung für dieses Problem, die mir von S. Paavolainen präsentiert wurde. Die Idee ist, den Standard malloc() , den Sie nur in der Linker tun können, durch einen benutzerdefinierten Zuordner,

, zu überschreiben
  1. liest den aktuellen Ausführungsstapel des Threads, der malloc() aufruft
  2. überprüft, ob der Stapel in einer Datenbank vorhanden ist, die auf der Festplatte gespeichert ist
    1. wenn der Stapel nicht existiert, fügt den Stapel zur Datenbank hinzu und gibt NULL zurück
    2. Wenn der Stack bereits existiert, reserviert er den Speicher normal und gibt
    3. zurück

Dann führen Sie einfach Ihren Komponententest viele Male aus: Dieses System zählt automatisch durch verschiedene Steuerpfade zu malloc() failure und ist viel effizienter und zuverlässiger als z.B. zufälliges Testen.

    
Antti Huima 10.11.2009, 21:17
quelle
2

Ich schlage vor, eine spezielle Funktion für Ihren speziellen malloc-Code zu erstellen, von dem Sie annehmen, dass er fehlschlagen könnte und Sie elegant damit umgehen könnten. Zum Beispiel:

%Vor%

Dann könntest du dieses schlaue Geschäft hier testen, indem du einige schlechte Werte für Bytes eingibst. Sie könnten dies in eine separate Bibliothek stellen und eine Scheinbibliothek erstellen, die sich speziell für das Testen der Funktionen, die diese aufrufen, verhält.

    
Dave 10.11.2009 21:21
quelle
2

Schreiben Sie Ihre eigene Bibliothek, die malloc implementiert, indem Sie das echte malloc (entweder statisch verknüpft oder explizit dlopened) zufällig ausfällt oder aufruft

dann LD_PRELOAD es

    
pm100 10.11.2009 21:59
quelle
1

Das ist ein bisschen eklig, aber wenn Sie Unit-Tests wirklich wollen, könnten Sie es mit #ifdefs machen:

%Vor%

Leider müssten Sie mit dieser Lösung viel neu kompilieren.

Wenn Sie Linux verwenden, können Sie auch Ihren Code unter Speicherdruck ausführen, indem Sie ulimit , aber sei vorsichtig.

    
Seth 10.11.2009 21:17
quelle
1

In FreeBSD habe ich einmal einfach das C-Bibliotheksmodul malloc.o überlastet (die Symbole dort waren schwach) und die malloc () - Implementierung durch eine ersetzt, deren Wahrscheinlichkeit, fehlzuschlagen, kontrolliert wurde. Also habe ich mich statisch verbunden und begonnen, Tests durchzuführen. srandom () beendete das Bild mit einer kontrollierten Pseudozufallsfolge.

Sehen Sie sich auch hier für eine Reihe guter Tools an, die Sie meiner Meinung nach brauchen. Zumindest überlasten sie malloc () / free (), um Lecks zu verfolgen, so dass es als nützlicher Punkt erscheint, um etwas hinzuzufügen, was Sie wollen.

    
Roman Nikitchenko 10.11.2009 21:16
quelle
1

Sie könnten malloc entführen, indem Sie einige Definitionen und globale Parameter verwenden, um es zu kontrollieren ... Es ist ein bisschen hackisch, aber scheint zu funktionieren.

%Vor%     
Rickard 10.11.2009 22:18
quelle