Announcement

Collapse
No announcement yet.

Ungültige Zeigeroperation teilweise

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Ungültige Zeigeroperation teilweise

    Hallo zusammen,


    ich habe ein Problem das mir teilweise meine Software abstürzt. Im Betrieb mit der .exe (nicht im Debugger) stürtzt das Programm ohne eine Meldung ab, respektive das Fenster schliesst sich einfach und das Programm ist weg.

    Im Debugger krieg ich die Fehlermeldung "Ungültige Zeigeroperation". Was ich auch schon festgestellt habe beim Step by Steb debugging, ist dass manchmal die aktuelle Zeile nicht zur nächsten hüpft sondern 2 vorher, oder 4 vorher, oder x vorher.... Dieses Verhalten kann ich nicht jedesmal feststellen.


    Die Abstürze passieren auch nicht regelmässig, was eine Fehlersuche praktisch unmöglich macht.


    den ganzen Code kann ich leider nicht posten, da es sich um Firmensoftware handelt.


    Ich vermute es könnte an String->char umwandlungen liegen. Grundsätzlich arbeite ich mit der Seriellen Schnittstelle, und versende und empfange Daten an diese. Diese Daten sind teils hardcodiert und zu einem grossen Teil aus einer Datei ausgelesen.

    ein paar Ausschnitte:

    Code:
    char* Content;
    DWORD ContentSize;
    DWORD PacketSize;
    unsigned int SendSize=PacketSize;
    char* chrInputBuffer = new char[20];
    char* chrOutputBuffer = new char[PacketSize];
    
    ...
    
    
    //Daten aufbereiten
    for(tempi=0;tempi < SendSize+1;tempi++)
    {
      chrOutputBuffer[tempi] = Content[tempi + (PacketSize*intCount)];
    }
    
    ...
    
    //Daten senden
    FileWrite(CO.Kanal,chrOutputBuffer,SendSize);
    
    ...
    
    //Antwort lesen
    ReadBytes = FileRead(CO.Kanal,chrInputBuffer,11);
    
    if(ReadBytes > 0)
         {
          for(j=0;j < ReadBytes;j++)
          {
           switch(chrInputBuffer[j])
           {
            case '\b':
            case '-':
            case '|':
            case '/':
            case '\\':
             break;
    
            default:
             strInputBuffer += chrInputBuffer[j];
             break;
           }
          }
          if(strInputBuffer.Pos("ERROR"))
          {
           OutputDebugStringA("Es trat ein Fehler auf.");
           return 2;
          }
    
    ...
    
    
    ContentSize -= SendSize;
    SendSize = PacketSize;
    Hat jemand einen Ansatz? Oder kann ich euch noch mehr Informationen geben um zu einer Lösung zu kommen?

    Ich bin echt langsam an einem Punkt wo ich nicht weiter komme...



    Vielen Dank für Euer Verständnis

  • #2
    Originally posted by roman.haas View Post
    Im Debugger krieg ich die Fehlermeldung "Ungültige Zeigeroperation".

    Code:
    DWORD PacketSize;
    unsigned int SendSize=PacketSize;
    char* chrOutputBuffer = new char[PacketSize];
    
    ...
    
    
    //Daten aufbereiten
    for(tempi=0;tempi < SendSize+1;tempi++)
    {
      chrOutputBuffer[tempi] = Content[tempi + (PacketSize*intCount)];
    }
    Du reservierst ein char-Array mit PaketSize (=SendSize) Stück Elementen, läufst in der Schleife aber ein Element zu weit.
    Dirk

    Comment


    • #3
      Ok ich probiere das mal,


      aber könnte dies dazu führen, dass das Program nur teilweise abstürzt?


      Danke schonmal


      -edit-


      Habe es nun ausprobiert, ich krieg jedoch immernoch Fehlermeldungen:


      teilweise gehts
      teilweise kommt Unzulässige Zeigeraddition
      teilweise kommt Zugriffsverletzung bei Adresse....
      Zuletzt editiert von roman.haas; 08.12.2008, 15:03.

      Comment


      • #4
        Originally posted by roman.haas View Post
        aber könnte dies dazu führen, dass das Program nur teilweise abstürzt?
        Bestimt.

        Bufferoverflows verursachen alle mögliche Elend.

        Ich denke dus hast Codeguard nicht eingeschaltet? Benutze CodeGuard then sie
        wird dich für solche fehler warnen.


        Weiter können wir deine Code nicht Ueberprüfen. Zum Beispiel:

        char* Content;

        und dann:


        //Daten aufbereiten
        for(tempi=0;tempi < SendSize+1;tempi++)
        {
        chrOutputBuffer[tempi] = Content[tempi + (PacketSize*intCount)];
        }

        Content war nicht initialisiert und trotzdem hast du Content benutzt.
        Wohin zeigt Content bei diese function? Und zeigt sie nach eine stelle wo es
        tempi + (PacketSize*intCount) bytes gibt? Dass alles wissen wir nicht.


        Aber benutze CodeGuard. Die wird dir viele fehler melden

        Comment


        • #5
          Content wird der Funktion überwiesen in meinem Fall eine 588kbyte grosse Datei.


          Aber ich habe noch einen kleinen anderen Fehler gefunden, plus den Fix hgdorn scheinen bis jeztt keine Fehler mehr zu verursachen.


          Ich denke aber schwer das es an dem +1 gelegen hat was zuviel war.



          Danke euch für die hilfreichen Worte!


          Ich melde mich falls es doch noch nicht geht (denke aber es sieht gut aus (seit etwa 15min keine Fehler mehr)).

          vielen Dank!

          Comment

          Working...
          X