Ich habe vor kurzem Code für ein benutzerdefiniertes serielles Kommunikationsprotokoll geschrieben. Was ich gemacht habe, war, dass ich einen Teil (8/16 Bit) der Empfangsdaten verwendete, um anzuzeigen, wie groß die Rahmengröße ist. Basierend auf diesen Daten erwarte ich , dass keine Daten folgen. Ich benutze Crc, um einen Rahmen zu akzeptieren oder abzulehnen. Aber ich werde nicht in der Lage sein, die Framelänge Daten in die Crc, da auf der Empfängerseite sollte ich wissen, wie viele Daten zu erwarten, bevor ein Frame verarbeiten.Wie verhindert man Pufferüberlauf/Array-Überlauf?
Das Problem, das ich konfrontiert wurde, ist gelegentlich diese Rahmenlänge Daten wird beschädigt und es täuscht den Empfänger zu empfangen, dass viele Bytes, während die empfangende Array-Größe ist viel weniger als das. Dies korrumpiert viele kritische Systemvariablen, die in den aufeinanderfolgenden Speicherstellen vorhanden sind.
Wie verhindere ich, dass ein Pufferüberlauf auftritt? Meine Gedanken dazu 1) Verwerfen Sie die Framelayness Daten, wenn es einen bestimmten Wert überschreitet. 2) Verwenden Sie einen Datentyp, der die max. Wie die Verwendung einer Abkürzung, die den Bereich des Array-Index auf 256 Speicherpositionen beschränkt, und einen Puffer mit 280 Byte erstellen. 3) Speicher an einem separaten Ort zuweisen, so dass er die kritischen Systemvariablen nicht beeinflusst.
Eine Sache, die ich verwendete, um zu verhindern, in der Empfangsschleife stecken zu bleiben, ist die Verwendung eines Timeouts. Aber ich habe diesen Aspekt des Problems übersehen. Es sieht mir sehr danach aus, ob es Zeit ist, das Problem zu bestätigen und zu reproduzieren, da Code somit Teil eines größeren Systemcodes ist und ich hier kein Experte bin.
Allgemein, wie man diese Art von Problemen sicher behandelt?
Auch: Was sind allgemeine Überlegungen oder Standardverfahren bei der Verwendung eines Arrays, um ein Überlaufen zu verhindern?
Entschuldigung, wenn ich einige Terminologien missbraucht habe. – seetharaman
Ich würde sagen 2) ist die richtige Antwort. (Obwohl 'short' 2 Byte ist und was Sie wollen, ist ein Ein-Byte-Wert.) – user3386109
Ich verstehe nicht, wie die Daten der Rahmenlänge, die beschädigt werden, den Empfänger in einen Pufferüberlauf täuschen könnten. Sicherlich liest der Empfänger genau die Anzahl der Bytes, die er erwarten soll (oder versucht, dies zu tun), und es liegt im Ermessen des Empfängers, sicherzustellen, dass er einen ausreichenden Puffer dafür hat, selbst wenn die empfangene Rahmengröße falsch ist. –