Speichervorgaben einer Funktion mit unbekannter Implementierung testen



  • Hallo,

    angenommen, ich beauftrage einen Programmierer, eine komplexe Software zu schreiben (das soll hier hoher Speicherbedarf bedeuten), z.B. für Manipulationen einer Bilddatei. Programmiersprache ist C im Standard C99. Dabei stelle ich bestimmte Speicherbedarfsvorgaben an eine Operation "opXY", nämlich soll diese Funktion während der Bearbeitung nicht mehr Speicher anfordern als 10% der Bildgröße des übergebenen Bildes.
    Ist es möglich, die Einhaltung dieser Eigenschaft bei unbekannter Implementierung der Funktion mittels eines weiteren C-Programms zu überprüfen?

    Ich kann mir nicht vorstellen, dass das möglich ist, weil mein Testprogramm keinen "Einblick" in die Fremdsoftware hat. Diese könnte bei Initialisierung mehrere Threads erzeugen, die beliebig Speicher anfordern und freigeben könnten, sodass eine Abfrage, wie viel das Programm insgesamt gerade an Speicher benötigt, nicht zielführend ist. Es müsste also diese Funktion vom Rest des Programms "abgekoppelt" betrachtet werden können. Und selbst dann würde es ja noch vom BS abhängen, ob ein malloc auch wirklich dazu führt, dass dem Programm insgesamt neuer Speicher zugeteilt wird.

    Sind meine Gedanken dazu einigermaßen richtig? Oder gibt es doch irgendwie eine Möglichkeit?

    Vielen Dank 🙂

    Ich habe diese Frage bereits im Forum C (auf dieser Webseite) gestellt, aber bisher keine Antworten erhalten. Mir ist nun aufgefallen, dass die Frage in dieses Forum besser passt, darum poste ich hier nochmal und schreibe einen entsprechenden Hinweise in den anderen Post.



  • Nur, falls du noch interessiert bist ... ist schließlich schon was her.

    coder21 schrieb:

    Ich habe diese Frage bereits im Forum C (auf dieser Webseite) gestellt, aber bisher keine Antworten erhalten. Mir ist nun aufgefallen, dass die Frage in dieses Forum besser passt, darum poste ich hier nochmal und schreibe einen entsprechenden Hinweise in den anderen Post.

    Dann hoffen wir mal, dass die Software dann auch wirklich auf Linux/UNIX läuft. 🙂 Ist halt eine sehr OS-spezifische Frage.

    coder21 schrieb:

    angenommen, ich beauftrage einen Programmierer, eine komplexe Software zu schreiben (das soll hier hoher Speicherbedarf bedeuten), z.B. für Manipulationen einer Bilddatei. Programmiersprache ist C im Standard C99. Dabei stelle ich bestimmte Speicherbedarfsvorgaben an eine Operation "opXY", nämlich soll diese Funktion während der Bearbeitung nicht mehr Speicher anfordern als 10% der Bildgröße des übergebenen Bildes.
    Ist es möglich, die Einhaltung dieser Eigenschaft bei unbekannter Implementierung der Funktion mittels eines weiteren C-Programms zu überprüfen?

    Fassen wir zusammen: du willst sicherstellen, dass Programm X nicht mehr als 10% Speicher anfordert, wie Input vorhanden ist.

    Da gibt es jetzt natürlich einige Fallstricke, z.B. wie die Implementierung des ersten Programms aussieht. Am einfachsten ist es, wenn das Programm sich von sich selbst aus limitiert - das kann man mit setrlimit(2) erreichen. Wenn das Programm iterativ eine Liste abarbeitet, sollte es immer die Dateigröße ermitteln, sich dann selbst limitieren, und dann anfangen zu werkeln. Abhängig von den Bilddateien kann es dann aber sein, dass nicht genug Speicher vorhanden ist. Ein guter (TM) Programmierer fängt sowas ab und gibt dann eine Meldung raus, dass so und so viel Speicher mindestens vorhanden sein muss. (Würde aber nur für die krassen Fälle sein, wo du das Programm wirklich hart limitierst - einige Emulatoren beispielsweise geben eine Option an, ob der User das ROM jetzt streamen möchte (wenig Speicheranforderungen, aber greift immer wieder auf die Platte zu), oder ob es komplett geladen/gemappt werden soll (hohe Speicheranforderungen, aber auf die Platte muss nicht mehr zugegriffen werden) - und wenn selbst bei gesetzter erster Option nicht genug Speicher vorhanden ist, dann ist dein Limit zu restriktiv oder der Algorithmus inhärent zu teuer für deine Anwendung).

    Das ist eine Möglichkeit. Es kann auch sein, dass das Programm sich NICHT selbst limitiert, und du den Quellcode nicht hast/nicht durchblickst, wo das Limit eingefügt werden soll. Da hast du dann das Problem, dass, selbst wenn du extern limitieren willst (geht über ulimit(1) , du ja immer prüfen willst, wie viel Speicher relativ zum gerade bearbeiteten Bild verbraucht wird), du die Information benötigst, WELCHES Bild gerade bearbeitet wird. Wenn das Programm das irgendwie exportiert oder das Programm nicht iterativ arbeitet, sondern nur iterativ aufgerufen wird (mit dem Namen des Bildes als Argument - siehe hierzu /proc -Dateisystem), dann kannst du die Bildgroße ermitteln und das Limit mit prlimit(1) setzen (sofern ich weiß, geht ulimit nicht bei laufenden Prozessen).

    Ansonsten wären ein paar zusätzliche Informationen auch nicht schlecht.

    coder21 schrieb:

    Ich kann mir nicht vorstellen, dass das möglich ist, weil mein Testprogramm keinen "Einblick" in die Fremdsoftware hat. Diese könnte bei Initialisierung mehrere Threads erzeugen, die beliebig Speicher anfordern und freigeben könnten, sodass eine Abfrage, wie viel das Programm insgesamt gerade an Speicher benötigt, nicht zielführend ist. Es müsste also diese Funktion vom Rest des Programms "abgekoppelt" betrachtet werden können. Und selbst dann würde es ja noch vom BS abhängen, ob ein malloc auch wirklich dazu führt, dass dem Programm insgesamt neuer Speicher zugeteilt wird.

    Zumindest moderne OS sind in der Hinsicht faul - sie sagen dir zwar zu, dass Speicher reserviert ("comiited") wurde, aber wirklich mit physikalischem Speicher verknüpft wird nur dann, wenn ein Page Fault von der Hardware kommt und der Kernel in seinen Büchern nachschaut, ob er kein Mapping für den Speicherbereich hat und einen Segfault senden muss oder ob er sich daran machen muss, tatsächlich physikalischen RAM zu mappen. An welche Größe bist du da interessiert - virtuell (wie viel das Programm ansagt, dass es benötigt) oder physikalisch (wie viel das Programm tatsächlich verbraucht)?

    Notfalls - ganz, GANZ im Notfall, heißt das - könnte man auch ein Kernelmodul schreiben, welches diese Daten exportiert und setzt.


  • Mod

    Ich glaube, er meint, dass eine spezielle Funktion im Programm gewissen Speichervorgaben entsprechen soll. Aber der Rest des Programms darf währenddessen machen, was er möchte. So nach dem Motto "Wie viel Speicher verbraucht die Druckfunktion in meinem Browser abhängig von der Webseite?". Das ist, insbesondere angesichts der sonstigen Vorgaben (kein Zugriff auf den Code, usw.), meiner Ansicht nach unprüfbar, aber ich wollte keine negative Antwort geben, für den Fall, dass doch jemand eine geniale Idee hat.


Anmelden zum Antworten