007
15.06.2003, 21:27 Uhr
virtual
Sexiest Bit alive (Operator)
|
In C89 gilt eine ganz einfache Regel: Bei gänzlich unbekannte Funktionen wird angenommen, daß sie ein int zurückliefern. Ein C89 konforme implementation darf - aber muß nicht zwingend - ohne enstprechende Includes kenntnis vom Rückgabewert einer Standardfunktion haben. Beefy benutzt den gcc. Der kannt die Deklarationen auch ohne Includes, jedenfalls einige. Andere Compiler kennen sie nicht. Deshalb ist die Verwendung von gets ohne include nicht konform, weil sich hier auf ein Implementationsdetail des Compilers verlassen wird. Klar, der Standard (egal welcher) verlangt, daß gets ein char* zurück geben soll. Aber der Standard in C89 sagt ziemlich klar: Wenn eine Funktion verwendet wird, deren Deklaration zum zeitpunkt ihrer ersten Benutzung nicht bekannt war, wird angenommen, daß sie ein int zurückgibt.
Was den Programmierfehler angeht, der liegt doch klar auf der Hand:
C++: |
main(c,b,f){for(f=open(gets(b),0);read(f,&c,1);putchar(c));}
|
1. In einem UNIX Environment gibt es tatsächlich einen dritten Parameter zu main. War niemals standardisiert, aber aus Kompatibilitätgrunden wird er immer mitgeliefert (mit "immer" meine ich UNIX). Tja. Wenn Du Dein programm nun auf einem System laufen läßt welches das nicht macht, dann schreibt Dein open ggf. an eine Stelle, die es garnicht gibt. 2. Wie meist üblich, würde ich solche Programme wie oben ohne weitere Vorkehrungen einfach so starten:
Jedenfalls habe ich noch keine anderen Parameter übergeben und es scheint auch nicht gefordert. Gemaäß C89 zeigt damit b (dessen typ ja eigentlich ein char** ist) auf einen Speicherbereich der Größe sizeof(void*)*2, auf einer 32 Bitmaschine also ein Speicherbereich mit 8 bytes. Dh wenn Du eine Zeile mit gets einliest, die länger als 8 Bytes ist, wird gnadenlos im Speicher rumgeschrieben, in Speicher der Dir nicht gehört. Ich weiß nicht, was Du mit Page meinst. Kein ANSI Standard macht angaben über das Speichermodell. POXIS auch nicht. argv (oder b) könnte in einem Speicherbereich liegen, der Knapp am Nirvana liegt.
Ich finde Die rästel ganz lustig, ja. Aber ich finde nicht, daß sie in irgendeiner Form was mit Standards von C zu tun haben. Eine faires Regelwerk wäre meiner Meinung nach: 1. Zähle die Includes nicht mit 2. Orientiere dich dafür an einem aktuellen Standard (also ISO C++/C99). Denn alles andere ist Schnee von gestern. -- Gruß, virtual Quote of the Month Ich eß' nur was ein Gesicht hat (Creme 21) |