printf überschreiben



  • Guten Abend zusammen,

    ich versuche gerade die printf Funktion durch meine eigene zu ersetzen. (Ja ich weiß das macht man so eigentlich nicht, aber ich möchte es einfach versuchen)

    An sich sollte es ja einfach sein:
    Die Funktion nachbilden und anschließend zu den jeden jeweiligen Files hinzulinken.
    An sich funktioniert es auch. Nur wenn ich ein '\n' hinzufüge, benutzt er nicht mehr meine Funktion sondern die aus der stdio.h. Bei allen anderen charakter wie '\r', '\t', usw. funktioniert es.

    Hier mal mein Code:

    #include <stdio.h>
    #include <stdlib.h>
    #include <stdarg.h>
    #include <time.h>
    
    #ifdef printf
    #undef printf
    #endif
    
    static char    *get_time(void);
    
    int printf(const char *p_fmt,...) {
    	va_list         argptr;
        FILE *fp;
        char header[60];
    
    	va_start(argptr, p_fmt);
    
        fp = fopen("/tmp/test.log", "a");
    
        sprintf(header, "%s ", get_time());
        fputs(header, fp);
    
    	vfprintf(fp, p_fmt, argptr);
    	fflush(fp);
    
    	va_end(argptr);
    	fclose(fp);
    	return (0);
    }
    
    static char *get_time(void)
    {
    	static char     zeit_str[20];
    	time_t          tp;
    	struct tm      *p_local_time;
    	struct timeval  tp1;
    
    	time(&tp);
    	p_local_time = localtime(&tp);
    
    	gettimeofday(&tp1, NULL);
    
        strftime(zeit_str, sizeof(zeit_str), "%m.%d.%Y %H:%M:%S", p_local_time);
    
    	return (zeit_str);
    }
    

    Makefile:

    all:
    	gcc -g -c logging.c -o logging.o
    	gcc -g test.c logging.o -o test -Wl,-Map -Wl,output.map
    
    clean:
    	rm *.a *.o
    

    Testprogramm:

    #include <stdlib.h>
    
    #ifdef printf
    #undef printf
    #endif
    
    extern int printf(const char *,...);
    
    int main()
    {
        printf("Hello World\n"); //Funktioniert nicht
        printf("Hello World"); //Funktioniert
    }
    


  • Schuss ins Blaue: Der Compiler optimiert irgendwas von wegen printf->puts. Änder mal testweise den Namen deiner Funktion dass du sicher bist das diese aufgerufen wird. Oder Optimierung abschalten?



  • Ich kann das Problem nachstellen. -O0 bringt nichts (falsch?), umbenennen in pprintf hilft. Das Interpretieren überlasse ich anderen...



  • An so etwas habe ich auch schon gedacht.
    Mit einer Namensänderung funktioniert es.
    An eine Optimierung habe ich auch schon gedacht, nur habe ich ehrlich gesagt nicht herausbekommen wie ich diese abschalte. Finde überall nur wie man sie einschaltet.



  • -fno-builtin-printf löst das Problem.



  • Jawol. Danke.
    Wo hast du es gefunden? Habe mir die Finger wund gegoogelt.



  • Ich hatte da was im Hinterkopf, hab dann die Doku (gibts als durchsuchbares pdf) nach printf durchsucht und gelesen und probiert.



  • Nebenbei bemerkt, ich hab get_time() rauswerfen müssen weil der Compiler bei mir meckert:

    struct timeval tp1;
    storage size of 'tp1' isn't known
    Funktioniert das bei dir? 😕 MinGW GCC 4.7.2


Log in to reply