Free memory read in fprintf



  • Hallo zusammen.

    Ich stehe gerade richtig auf dem Schlauch.
    Habe eine Anwendung geschrieben, die sich als Quiz in einen Chat einloggt und dort Fragen stellt.
    Soviel zur Grundfunktion des Programmes.

    Nun kann man in die Eingabezeile des Chat z.B. !suche [Wort] eingeben und er sucht in der MySQL Datenbank nach [Wort]. Und genau da hänge ich gerade fest und sehe den Fehler nicht.

    Er sucht z.B. nach Essen oder Technik einwandfrei und liefert die Ergebnisse zurück.
    Sucht man nun aber nach "spyware" stürzt das Programm ab und meldet einen Fehler in msvcrt.dll.

    Lasse ich das ganze durch Purify von IBM laufen meldet dieses:
    "Free memory red in fprintf".

    Hier mal der kleine Code von "suche".

    void sucheSQL(MString *SenderX, MString *wortX) {
      MYSQL_RES *res, *res1; 
      MYSQL_ROW row,row2;
      char *query, *query1;
      MString z,x;
      x = wortX->print ();
      x.concat ("END");
      z = x.getbedfirst ("!suche ", "END");
      //free(query);	    
      query=(char*)calloc(255, sizeof(z));  
      sprintf(query, "select count(*) from fragen where Frage like '%%%s%%';",z.print());
      res=SQLGetCommand(query);
      row=mysql_fetch_row(res);   
      //free(query);
      query1=(char*)calloc(255, sizeof(z));
      sprintf(query1, "select count(*) from fragen where Antwort like '%%%s%%';",z.print());
      res1=SQLGetCommand(query1);
      row2=mysql_fetch_row(res1);   
    
      MString p;
    		p = "Für ";  
       		p = p + z.print();
    		p = p + " gibt es ";
    		p = p + row[0];
    		p = p + " Treffer in den Fragen und ";
    		p = p + row2[0];
       	    p = p + " Treffer in den Antworten";
        	ChatBot.say (p.print ());
      //free(query);
    }
    

    Vielen Dank im voraus für eure Hilfe.

    So long,
    SKB



  • Kannst du etwas genauer einstufen, wo das Programm sich aufhängt?

    (btw, die Tatsache, daß du mit Nicht-Standard-Funktionen arbeitest, macht die Fehlersuche nicht gerade einfacher 😉 - von den Speicherlecks gar nicht zu reden)



  • Hallo.

    Ich hoffe, dir ist das Programm Purify von IBM bekannt.

    Also das void() an sich funktioniert ja. Es stürzt nur ab, sobald nach "spyware" oder auch, wie jetzt festgestellt, nach "nu" sucht. "Nutella" lässt das Programm auch abstürzen.

    Suche ich z.B. nach "Köln" oder "Koeln" dann gibt er aus "Für Köln gibt es 809 Treffer in den Fragen und 20 in den Antworten."

    Was wären denn für den Teil des Programms "Standardfunktionen"? Dann würde ich es ja dahingehend umbauen und weiterforschen.

    So long,
    SKB



  • SKB schrieb:

    Hallo.

    Ich hoffe, dir ist das Programm Purify von IBM bekannt.

    Leider nein. Aber wenn das Programm nichtmal feststellen kann, in welcher Codezeile dein Programm abschmiert, taugt es nichts.

    Was wären denn für den Teil des Programms "Standardfunktionen"? Dann würde ich es ja dahingehend umbauen und weiterforschen.

    Da der Standard keine Datenbank-Bibliothek bietet, gibt es wohl wenige Alternativen.

    übrigens: Deine Speicherverwaltung ist etwas eigenartig - die beiden calloc()-Aufrufe beschaffen jeweils Platz für 255 MString-Objekte (keine Ahnung, wie groß die sind. Und das Hantieren mit Zeigern ist nicht gerade C++-like.



  • Also das Programm Purify von IBM zeigt die fehlerhaften Aufufe des Programms an.
    Heisst, man kann ein beliebiges Programm in der Laufzeitumgebung von Ourify starten und sich damit verschiedene Speicherfehler anzeigen lassen.

    Hat mich dann immerhin schon soweit gebracht, dass ich nun irgendwie weiss, dass mein Programm einen "freed Memory" lesen möchte.

    Ich steige aber nicht dahinter, wieso das Programm abstürzt, wenn es per

    sucheSQL(MString Nickname, MString spyware);
    

    aufgerufen wird. Jedoch aber nicht, wenn es per

    sucheSQL(MString Nickname, MString Köln);
    

    aufgerufen wird.

    Hast du dazu vielleicht eine Idee?

    Gruß,
    SKB



  • Ein Nachtrag:

    Ich habe mein Projekt durch Dev-C++ Debugger laufen lasse. Dort funktioniert die Suche einwadnfrei und gibt "0 Treffer" aus.

    Läuft die Anwendung jedoch per "direktem" Aufruf stürzt sie mit der Fehlermeldung "Programm hat einen Fehler festgestellt und muss beendet werden."

    Das ganze läuft auf Windows XP und der Fehler tritt in der msvcrt.dll auf.
    Version: 7.0.2600.2180

    Nun eine Frage an die Profis 🙂

    Jemand ne Idee, wie das zu beheben ist?

    So long,
    SKB



  • SKB schrieb:

    Ich steige aber nicht dahinter, wieso das Programm abstürzt, wenn es per

    sucheSQL(MString Nickname, MString spyware);
    

    aufgerufen wird. Jedoch aber nicht, wenn es per

    sucheSQL(MString Nickname, MString Köln);
    

    aufgerufen wird.

    😮 Das steht bei dir so wörtlich im Code? Das sind ja noch nichtmal Funktions-Aufrufe, sondern lediglich Deklarationen (ganz davon abgesehen, daß 'Köln' kein legaler Bezeichner ist).

    Ansonsten hast du vermutlich irgendwo einen Speicherblock überschrieben, der dir nicht gehört, oder irgendwelche Zeitbedingungen durcheinandergewürfelt. Versuch' mal zu verfolgen, an welcher Stelle sich dein Programm verabschiedet (zur Not indem du nach jeder Anweisung eine Nachricht nach cerr schreibst).

    (Tja, Debugging erfordert mitunter auch etwas Kreativität ;))



  • Mir ging es nun nicht drum, wie etwas aufgerufen wird, sondern eher drum, wieso es abstürzt, wenn "spyware" enthalten ist.

    Es geht einzig und alleine um die Übergabe des Wortes "spyware" ich hab nun auch mal weitergeforscht und rausgefunden, dass ich keinen Speicherfehler bekomme, wenn ich statt:

    sprintf(query, "select count(*) from fragen where Frage like '%%%s%%';",z.print());
    

    Das hier:

    sprintf(query, "select count(*) from fragen where Frage like '%%s%';",z.print());
    

    verwende.

    Logischerweise ist es dann aber nicht mehr die gleiche SQL Abfrage *wirr*

    Mir scheint, dass es irgendwie mit den %-Zeichen zusammenhänngt. 😮



  • Wenn es Probleme mit einem bestimmten Wort gibt, liegt das möglicherweise an der Datenbank. Darum solltest du ja einschränken, welche Anweisung den Speicherfehler verursacht.

    (das einzige mögliche Problem, das mir im Moment auffält, wäre eine fehlende Null-Terminierung des Strings, den print() zurückgibt)

    PS: Und eventuell wäre es eine gute Idee, den Gebrauch von Zeigern etwas einzuschränken (std::string ist eine gute Alternative zu char*).


Anmelden zum Antworten