Forum: PC-Programmierung C - Struktur FILE


von Müller (Gast)


Lesenswert?

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

von Noch einer (Gast)


Lesenswert?

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.

von Müller (Gast)


Lesenswert?

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ß

von Kaj (Gast)


Lesenswert?

Wie wär's, wenn du einfach mal Code postest, damit das alle 
nachvollziehen können, statt diesem prosa-rosa geschwafel?!

von Yalu X. (yalu) (Moderator)


Lesenswert?

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 :)

von Rolf M. (rmagnus)


Lesenswert?

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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.