Hallo liebes Forum,
ich hatte heute vormittag etwas mit der FILE Structure herumgespielt.
Folgendes ist passiert. Durch Zufall habe ich herausgefunden dass man
auch durch Makros auf Strukturen zugreifen kann(Wisst ihr ja
wahrscheinlich schon ;)). Im speziellen mein ich den STDIN. Aus
irgendeinem einem Grund tritt der selbe Effekt als würde man den Puffer
leeren, wenn man das "stdin->_cnt" auf 0 setzt. (Windows 8.1 CodeBlocks,
MinGW64 aktuelle V)
Ich tippe mal darauf dass das "current" heißen soll, und die aktuelle
Position beinhaltet.
Könnt ihr euch das erklären? Was passiert da genau?
Gruß Müller
Die Leute, die die Library schrieben, hatten sich größte Mühe gegeben,
damit du nicht auf die Interna zugreifen kannst.
Der Grund dafür: Jeder macht das anders. Und die wollen solche Interna
ohne Ankündigung von einer auf die andere Version ändern. Meist kann man
da nicht einfach einen Wert ändern, muss mehrere Werte gleichzeitig
konsistent ändern.
Wenn du dich für so etwas interessierst - beim GCC bekommst du alle
Quelltexte für die Libraries. Kannst genau nachvollziehen, was da wie
gemacht wird.
Übrigens, cnt ist normalerweise die Abkürzung für count.
Du hast recht. Aber wenn man die Struktur direkt in die stdio.h
schreibt, ziemlich weit oben. Dann hat man sich ja nicht viel Mühe
gegeben, damit ich das nicht sehen kann ;)
Die glibc unterscheidet sich extrem von der die bei mir in den includes
drinnen ist.
Mit dem Cnt für count hast du recht. Aber trotzdem leuchtet mir der
Effekt noch nicht wirklich ein.
Wenn ich den Cnt auf 0 setze, sage ich dem, dass da aktuell nichts
drinnen ist. Ist ja dann quasi so, dass ich dem vergaukle, dass der
Puffer leer wäre. Womit dann beispielsweise eine erneute Eingabe ohne
Probleme funktioniert(1. Eingabe absichtlich mehr Zeichen, damit die
noch im Puffer drinnen sind).
Ich könnte mir jetzt vorstellen, wenn man das nach jeder Eingabe auf 0
setzt, und immer bei einer eingabe mehr Zeichen eingibt(Fgets), dass ich
da mit den immer übrig geblieben Zeichen im Puffer, den stdin irgendwann
zum overflow bringen könnte.
Könnte das sein?
Gruß
MinGW verwendet die C-Laufzeitbibliothek von Microsoft (msvcr*.dll).
Deren Interna (und dazu gehört auch dieses _cnt) sind m.W. nicht
öffentlich dokumentiert.
Dir bleibt also nicht anderes übrig, als
- zu raten,
- herumzuprobieren,
- die msvcr*.dll reverse-zu-engineeren
- oder die Wine-Sourcen anzuschauen und zu hoffen, dass die Wine-
Entwickler richtig geraten, herumprobiert und reverse-geengineert
haben.
Der Nutzen dieser Aktion wird aber eher gering sein, denn wenn du auf
solche Tricks baust, wird dein Programm gerade einmal unter Windows und
dort evtl. auch nur mit einer bestimmten Version der Laufzeitbibliothek
funktionieren.
Müller schrieb:> ich hatte heute vormittag etwas mit der FILE Structure herumgespielt.
Herumspielen ist natürlich immer erlaubt :)
Müller schrieb:> Du hast recht. Aber wenn man die Struktur direkt in die stdio.h> schreibt, ziemlich weit oben. Dann hat man sich ja nicht viel Mühe> gegeben, damit ich das nicht sehen kann ;)
Naja, sehen kannst du es schon, wenn du willst, aber es sollte dich
nicht interessieren. Das sind Interna, und wenn du da direkt dran
rumpfuschst, kann alles mögliche passieren.
> Wenn ich den Cnt auf 0 setze, sage ich dem, dass da aktuell nichts> drinnen ist.
Nein. Du manipulierst interne Daten, ohne deren Bedeutung zu verstehen.
Das ist so, als ob du deinen Fernseher aufmachst, und dann irgendwo
wahllos einen Widerstand einlötest und nun versuchst, zu verstehen,
warum als Reaktion darauf das Bild nun grün ist.