Pufferüberlauf / Stack around the variable 'x' is corrupted
-
-
TGGC schrieb:
Ja, real programmers nehmen immer mehr ab. Der Einzige der zunimmt scheine ich zu sein.
-
Geh es systematisch an.
- irgendwas stimmt mit x nicht
- wo verwendest du x?
- was ist ein Puffer?
- was ist ein Pufferüberlauf?
(- wie provoziert man den und ist das eventuell sogar ein häufiges Problem?)
- schreibst du etwa über den Puffer hinaus?Bingo!
-
[quote="Ruvi"]Hallo,
editier mal bitte deinen Eintrag und pack den Code in Code tags und formatier ein wenig.[/quote]
Werd ich machen
-
[quote="Ruvi"]Hallo,
editier mal bitte deinen Eintrag und pack den Code in Code tags und formatier ein wenig.[/quote]
Ach ja und wie geht das? mit dem Code-tag komme ich net so wirklich klar
-
[quote="asdfgh.."]Geh es systematisch an.
- irgendwas stimmt mit x nicht
- wo verwendest du x?
- was ist ein Puffer?
- was ist ein Pufferüberlauf?
(- wie provoziert man den und ist das eventuell sogar ein häufiges Problem?)
- schreibst du etwa über den Puffer hinaus?Bingo![/quote]
Hab ich schon. Wie auf etlichen anderen Websites auf denen ich schon Hilfe gesucht habe habe ich wie hier nur gesagt bekommen, wie ich es mache, was aber nie funktioniert. Dann gehe ich mal wieder auf eine andere Website, weil ich hier scheinbar auch keine wirkliche Hilfe bekommen...
-
Basti153 schrieb:
Der Titel sagts schon aus [...] Ich habe keine Ahnung, was mir da für ein Fehler unterlaufen ist, und deswegen suche ich hier Hilfe.
Pufferüberlauf nennt man die Fehler, wo man eigentlich auf einen bestimmten Speicherbereich zugreifen will, dann aber dabei "daneben langt", z.B. mit ungültigen Array-Indizes. Genau das hast Du gemacht, wobei der "Puffer" hier dein
renderScreenist. Guck dir an, was für x- und y-Werte du verwendest. Davon sind nicht alle erlaubt.
-
[quote="krümelkacker"][quote="Basti153"]
Der Titel sagts schon aus [...] Ich habe keine Ahnung, was mir da für ein Fehler unterlaufen ist, und deswegen suche ich hier Hilfe.
[/quote]
Pufferüberlauf nennt man die Fehler, wo man eigentlich auf einen bestimmten Speicherbereich zugreifen will, dann aber dabei "daneben langt", z.B. mit ungültigen Array-Indizes. Genau das hast Du gemacht, wobei der "Puffer" hier deinrenderScreenist. Guck dir an, was für x- und y-Werte du verwendest. Davon sind nicht alle erlaubt.[/quote]
Danke, so eine Antwort habe ich gesucht
-
Wie merkbefreit bist du eigentlich?
Aktivier mal BBCode bei deinen Beiträgen.
-
Basti153 schrieb:
Hab ich schon. Wie auf etlichen anderen Websites auf denen ich schon Hilfe gesucht habe habe ich wie hier nur gesagt bekommen, wie ich es mache, was aber nie funktioniert.
Ich habe dir eine Anleitung zur Fehlerbehebung in die Hand gegeben, weil du davon im Moment (einige Wochen C++ Erfahrung) am meisten profitierst. Wenn du die geposteten Punkte selbst bearbeitest, dann hilft dir das langfristig. Solltest du nach eigener Recherche Fragen zu den Punkten haben, dann nur her damit.
(Falls es dich interessiert, es gibt zu dem Fehler sogar einen ganzen Eintrag in der deutschen Wikipedia: Off-by-one-Error.)
-
Basti153, statt mit "rohen Arrays" à la
int[6]kannst du auch mitarray<int,6>aus demstd-Namensraum arbeiten. Das gibt es seit C++11. Es bietet Dir typischerweise – zumindest mit g++/libstdc++ – auch einen netten Debug-Modus an, der dir dann solche Fehler wie ungültige Indizes schon viel früher abfängt. Versuche am besten rohe Arrays und Zeiger zu vermeiden. Wie du gemerkt hast, ist das fehleranfällig.Statt Zeiger bräuchten wir eigentlich so etwas wie eine standardisierte Familie von
array_view-Typen, die auch einen solchen Debug-Modus anbieten. Denn oft sieht man ja Funktionen, die Zeiger + Länge übergeben bekommen. Das sollte IMHO ein einziger Parameter sein. In anderen Sprachen gibt's das ja auch oft unter dem Namen "slice". Ich habe mir so etwas selbst nachgebaut (allerdings ohne "checked iterators"). Dieses Klassentemplate erlaubt dann z.B. folgenden Code:void anzeigen(slice<const int> s) { while (s) { std::cout << s.shift_ref() << std::endl; // quasi *ptr++ Äquivalent } } int main() { int feld[] = {1,2,3,4,5}; std::vector<int> vektor = {1,2,3,4,5,6,7,8,9}; anzeigen(feld); // 1 bis 5 anzeigen(vektor); // 1 bis 9 anzeigen(const_all_of(vektor).slice_from(4)); // 5 bis 9 }Ich weiß, dass ich nicht perfekt bin, also überlasse ich das "Indexgeprüfe" lieber
slice<T>im Debugmodus.Warum keine Iteratoren? Weil mich Iteratoren, zumindest das, was man in C++ darunter versteht, nerven! Lineares Speicherlayout kommt zudem bei mir recht oft vor. Mein
sliceist quasi ein Spezialfall einer "Alexandrescu-Range" für lineares Elementen-Layout. Was die letzten Ideen von Eric Niebler in der Richtung angehen, da bin ich leider nicht auf dem aktuellen Stand.Und weil das so schön zum Thema Speichersicherheit passt hier noch ein Tipp: Rust 1.0.0-beta.2 ist jetzt veröffentlicht worden.
SCNR