Hallo,
Sagte der mir doch:
Überprüfen Sie bitte Ihre Mitteilung! Sie ist zu lang (maximal 12288 Zeichen).
Ja sowas!
Waren 12325 ohne diese Zeilen.
Is abba kleinlich! ;-)
Weder getpid(), close() noch unlink() sind ANSI C 99.
Von close() wusste ich das ja. Aber bei getpid() und unlink() haett ich das
jetzt nicht gedacht. Auf welche Ersatz-Funktion sollte man denn zugreifen,
anstelle von unlink()?
Also, ANSI C bietet an:
7.19.4.1 The remove function
Synopsis
1 #include <stdio.h>
int remove(const char *filename);
Kannst auch unlink() nehemn, mußt aber davon ausgehen, das das nicht unbedingt portabel ist.
unistd.h übrigens auch nicht ;-)
Ach ne ;-)
BTW: ist das evt keine gute Idee auf allzuviele nicht ANSI C Funktionen
zurückzugreifen?
Ja. Im Moment sind es zwei. Wenn du mir sagst, wie ich das noch weiter
reduzieren kann... ich muss halt irgendwie ein eindeutiges Merkmal erhalten
(deshalb getpid()) und irgenwie die Datei wieder entfernen.
Ist ja nur noch getpid()
Ein eindeutiges Merkmal gibt es z.B. mit tmpnam() bzw tmpfile()
Zeile 234: malloc() ohne Überprüfung? Ganz böse Falle, aber wirklich
ganz böse!
Find ich gar nicht. Wann sollte heutzutage noch ein malloc()
fehlschlagen, gerade wenn es nur um ein paar Bytes geht?
Da Du nicht weißt, wie malloc() auf der jeweiligen Architektur funktioniert,
gibt es einige Gründe.
Nenn mir mal einen, damit mein Verstaendnis dafuer waechst ;-)
Du kannst Dich nicht darauf verlassen, daß auch nur ein Byte frei ist (oder besser: alle verlangten Bytes frei sind) und alloziert werden kann.
Du kannst Dich nicht darauf verlassen, daß die Speicherverwaltung sauber ist.
Der verlangte physische Speicherbereich kann kaputt sein, der Kernel verträgt es, gibt halt nur einen Fehler zurück und merkt sich die kaputte Stelle. (Ganz schön Science Fiction, zugegeben, aber theoretisch machbar ;-)
Die malloc() Implementation ist, mit Verlaub, für'n Arsch.
Und noch einige Kleinigkeiten die einem besonders unter den verschiedenen MS OSen recht viel Freude bereiten.
Drum prüf die Speicherallozierung auf Erfolg. Kost' nicht viel und beruhigt ungemein ;-)
Kannst Dein malloc() an den meisten Stellen eh ganz weglassen.
Sicher, aber dann muesste ich mit festen Groessen arbeiten (Arrays), und das
moechte ich moeglichst vermeiden. So kann ich die Groesse ziemlich genau
bestimmen.
Nein, warum? Pointer reichen. Damit kann auch keine Ärger mit der Größe auftauchen.
(Hatte ich nicht von Dir neulich mal einen Preis bekommen für die "most
useless pipe", oder war das der Michael? ;-)
Nein, ich hatte gesagt, das sei 'useless use of a pipe'
Achja, der war das ;-)
-- aber meinetwegen
koennen wir gerne einen Preis draus machen g
Mmh... ich hätte gerne , ... äääääh ... die Waschmaschine. ;-)
und weder strcpy() noch strcat() sind eigentlich zu empfehlen.
Warum?
strcpy() weil in Deinem Fall tempfile = cfile (+ der danach notwendigen
Änderungen) besser gewesen wäre, hätte auch die Speicherallokation gespart.
(Nur die Adresse wird kopiert)
Aber dann haette ich die Zahl wieder hinten dran gehabt, und auch haette ich
das Problem, dass evntl. die Laenge zu gross wird.
Wieso kann die Länge zu groß werden? Sind doch nur Zeiger. Im Normalfall decken die die ersten 4GB auf jeden Fall ab. Sind sogar individuell, da sparst Du Dir noch das getpid().
strcpy() kann in die Hose gehen, wenn Argument 1 kein regulärer C String
ist (kein \0 am Ende).
Ja, das weiss ich. Damit kann ich umgehen, es ist ja in dem Fall
sichergestellt, dass die Strings 0-terminiert sind.
Wollte nur aufzählen, Du hattest schließlich gefragt ;-)
Aber wie auch schon gesagt: ist wohl doch eher Geschmacksfrage.
[... strncpy(), strncat() ...]
Das setze ich auch ein. Wenn ich mich nicht drauf verlassen kann. Aber hier
sehe ich den Sinn nicht.
Sind ein wenig schneller, da sie nicht extra zählen müssen.
Zeile 271: Memory Leak! gz ist noch nicht freigegeben vor dem return!
Bitte wie? 'gz' sollte doch fclose() freigeben, ich habe den Speicher
schliesslich nicht angefordert.
Ja und?
Wenn ich den Speicher nicht explizit angefordert habe, dann muss IMHO bei der
Beschreibung der Funktion ganz fett und in Grossbuchstaben, unterstrichen und
blinkend stehen 'You have to free() the memory!' ;-)
Das halte ich fuer ganz, ganz schlechten Code.
"Never trust a programmer!" ;-)
BTW: kam der nicht aus dieser einen Library, wo gerade eben erst ein ganz fieser Buffer Overflow entdeckt wurde? >;->
;-)
Aber ist immer besser. Wer weiß, welcher Compiler da dran geht. Kann ja
nicht immer GCC sein ;-)
Jaja, ich weiss ja noergel ;-)
"Hömma, das ist ANSI C!"
"Hömma, das ist Visual Crap!"
;->
Zeile 348: *gzip != 0 passt nicht. Die Stelle auf die der Pointer zeigt
ist Type char, 0 ist Type int.
Zum Glueck weiss der Compiler das auch und macht daraus einen char :-)
Was suchst Du da eigentlich? \0, also Ende vom String?
Ja.
Aha, dacht ich mir doch ;-)
NULL, also Ende vom Speicher?
Hae? Seit wann sind Felder NULL-Terminiert, wenn man das nicht per Hand macht?
Nein, komische Existenzprüfung.
Wenn ich mal in Fahrt bin, dann zähle ich auch alles auf ;-)
Dann schreib das doch einfach ;-)
'\0' sind drei Buchstaben mehr jammer ;-)
Und ich dachte, ich wäre faul ;-)
time() kann versagen, localtime() kann versagen.
Warum?
Frag die libc Programmierer. Alles schon erlebt.
Irgendwie sieht das sowieso komisch aus. Ich mache bei time() immer:
time_t t;
time(&t);
time(NULL) habe ich noch nie gesehen ;-)
Lies mal time(3) ;-)
Da steht:
SYNOPSIS
#include <time.h>
time_t
time(time_t *tloc);
[...]
The time() function returns the value of time in seconds since 0 hours, 0
minutes, 0 seconds, January 1, 1970, Coordinated Universal Time.
A copy of the time value may be saved to the area indicated by the
pointer tloc. If tloc is a NULL pointer, no value is stored.
Du siehst: 'a copy of the time value'.
Beispiel aus der C FAQ:
#include <stdio.h>
#include <time.h>
int main(void){
time_t now;
time(&now);
printf("It's %.24s.\n", ctime(&now));
return 0;}
Und nicht anders kenn ich das. Was sagt denn die info libc?
time_t curtime;
struct tm *loctime;
/* Get the current time. */
curtime = time (NULL);
/* Convert it to local time representation. */
loctime = localtime (&curtime);
Aha, die machen dsa so, wie Du.
Aber hast schon recht, ist wohl Geschmacksache.
BTW: NULL kann auch als (void)(0) definiert sein. (Ich z.B. mache das immer)
(Heißt natürlich (void *)(0), sorry ;-)
Das passt dann nicht in time() rein. Gibt zumindest 'ne Warnung.
Warum machst du sowas auch? ;-)
Um eine definiertes NULL Macro zu haben. Man weiß ja nie, was einem in den verschiedensten Libcs so begegnet.
ANSI C sagt ja nur:
(stddef.h)
NULL which expands to an implementation-defined null pointer constant
In stddef.h steht dann auf meiner Maschine:
#define NULL ((void *)0)
Wie heißt es so schön? "Your mileage may vary" ;-)
(Eigentlich darf time() da keine Probleme machen. Ist meine Libc wirklich so kaputt?)
BTW: welche Optimierung verträgt er eigentlich?
Schonmal ausprobiert?
Nein.
Diese Optimierungen vom GCC sind mir suspekt...
Och nö, geht mittlerweile. Arbeitet sauber.
Wenn der Code auch sauber ist! ,-)
Ich hab da ganz schlimme Dinge gehoert, z. B. sowas wie Aufrollen von
Schleifen schuettel
man gcc
Optimization Options
-fcaller-saves -fcse-follow-jumps -fcse-skip-blocks
-fdelayed-branch -felide-constructors
-fexpensive-optimizations -ffast-math -ffloat-store
-fforce-addr -fforce-mem -finline-functions
-fkeep-inline-functions -fmemoize-lookups
-fno-default-inline -fno-defer-pop
-fno-function-cse -fno-inline -fno-peephole
-fomit-frame-pointer -frerun-cse-after-loop
-fschedule-insns -fschedule-insns2
-fstrength-reduce -fthread-jumps -funroll-all-loops
-funroll-loops -O -O2 -O3
Such Dir was aus, sind alle dort beschrieben ;-)
zum Schluss. Das
mit der 'filename.conf' war mehr oder weniger ein Release-Quickhack, damit
ich bei den Binaries nicht den Cache-Pfad fest einkompilieren muss.
Könnte ja jetzt sagen: "So sieht's auch aus!", aber wer bin ich denn ;-)
Wieso?
Zugegeben, es mag vielleicht keine Loesung im C-Style sein. Aber sie ist doch
einfach und elegant?
Mpfffff...
Öh ...
Klarer Fall von Perl2C ;-)
Dadurch hast Du aber auch noch eine globale Variable, die Du ganz schlecht
wegbekommst. (Die andere (LgFile) ist einfach)
Och, wir werden sehen. Frueher war das halt ein '#define'.
Reicht das denn nicht "at compile time"?
Mich ärgern hardcompiled paths ja auch unsäglich, aber hier?
gzip_cncc.c:632:6: Test expression for if not boolean, type int: may_gzip()
steht da ja auch! Und ich wollte gerade wieder meinem Lint die Schuld in die
Schuhe schieben ;-)
Hehe ;-)
Da es in C keine Booleans gibt, halte ich die Fehlermeldung fuer falsch.
Nein, ausnahmsweise richtig ;-)
C99:
7.16 Boolean type and values <stdbool.h>
1 The header <stdbool.h> defines four macros.
2 The macro
bool
expands to _Bool.
3 The remaining three macros are suitable for use in #if preprocessing directives. They
are
true
which expands to the integer constant 1,
false
which expands to the integer constant 0, and
__bool_true_false_are_defined
which expands to the decimal constant 1.
Kann aber erst der GCC 3.x
(Das void steht bei mir aber nicht! ;-)
Dann guck dir mal den aktuellen Sourcecode an ;-)
Ja, bin ich ja schon bei ;-)
Nein, noch lange nicht ;-)
Gibt es einen Switch, der alle Warnungen ausgibt?
Nein, leider nicht. Mußt Du zusammenbauen, oder einen C Lint benutzen, z.B. splint http://www.splint.org mit der Option -strict.
Aber tu Dir das bloß nicht an! ;-)
Warum meinst Du eigentlich, das eine PID bis zu 1024 Stellen haben kann?
Nur so als Frage ;-)
Wer sagt, dass ich das meine? ;-)
Ich verwende 'buff' noch etwas spaeter, als fread()-Buffer.
Wie ich schon weiter oben erwähnte:
Jaja, typisch perl2C ;-)
BTW:
stdio.h
The value of this macro is an integer constant expression that is
good to use for the SIZE argument to setvbuf'. This value is guaranteed to be at least
256'.
The value of BUFSIZ' is chosen on each system so as to make stream I/O efficient. So it is a good idea to use
BUFSIZ' as the size
for the buffer when you call `setvbuf'.
[...]
Bin jetzt mal kurz über den Code gehüpft. Viel geändert hat sich nicht.
Werde mal per PM selber einen Vorschlag unterbreiten.
Wird hier im Forum dann doch zuviel. (Ja, wenn man einmal mal einen auf den Sack wg OT bekommen hat .. ,-)
so short
Christoph Zurnieden