Probleme mit va_list



  • Hallo,
    ich habe ein Problem mit der va_list und zwar habe ich mein Programm mit Valgrind überprüft und habe dann einige Fehler in einer Funktion bekommen, in der ich die va_list verwende. Ich habe schon mit der Forensuche nach einer Lösung gesucht, leider vergeblich.

    Hier erstmal der Code über den Valgrind meckert:

    void
    irc_send(char *text, ...)
    {
    	va_list	va;
    	char	buffer[MAXLEN*2];
    
    	memset(buffer, 0, sizeof(buffer));
    
    	va_start(va, text);
    	vsnprintf(buffer, sizeof(buffer), text, va);
    	va_end(va);
    
    	log_append(log_main, LOG_SEND, "%s", buffer);
    	strcat(buffer, "\n");
    
    	if(send(_socket, buffer, strlen(buffer), 0) == -1)
    	{
    		log_append(log_main, LOG_ERROR, "Send() failed. Exiting.");
    		quit_irc = 1;
    	}	
    }
    

    MAXLEN ist 512.

    Das ist die ganze Log Datei von Valgrind:

    ==22675== Memcheck, a.k.a. Valgrind, a memory error detector for x86-linux.
    ==22675== Copyright (C) 2002-2003, and GNU GPL'd, by Julian Seward.
    ==22675== Using valgrind-2.0.0, a program supervision framework for x86-linux.
    ==22675== Copyright (C) 2000-2003, and GNU GPL'd, by Julian Seward.
    ==22675==
    ==22675== My PID = 22675, parent PID = 22674. Prog and args are:
    ==22675== ./IRC
    ==22675==
    ==22675== Command line:
    ==22675== ./IRC
    ==22675== Startup, with flags:
    ==22675== --suppressions=/usr/local/lib/valgrind/default.supp
    ==22675== --leak-check=yes
    ==22675== --show-reachable=yes
    ==22675== --logfile=valgrind.out
    ==22675== -v
    ==22675== Reading syms from /var/irc/feigbot/IRC
    ==22675== object doesn't have any debug info
    ==22675== Reading syms from /lib/ld-2.2.5.so
    ==22675== object doesn't have any debug info
    ==22675== Reading syms from /usr/local/lib/valgrind/vgskin_memcheck.so
    ==22675== Reading syms from /usr/local/lib/valgrind/valgrind.so
    ==22675== Reading syms from /lib/libc-2.2.5.so
    ==22675== object doesn't have a symbol table
    ==22675== object doesn't have any debug info
    ==22675== Reading suppressions file: /usr/local/lib/valgrind/default.supp
    ==22675== Estimated CPU clock rate is 2021 MHz
    ==22675==
    ==22675== Conditional jump or move depends on uninitialised value(s)
    ==22675== at 0x804C41E: handle_user_message (in /var/irc/feigbot/IRC)
    ==22675== by 0x8049CAD: irc_parse (in /var/irc/feigbot/IRC)
    ==22675== by 0x804A4C7: irc_receive (in /var/irc/feigbot/IRC)
    ==22675== by 0x804A2F2: irc_loop (in /var/irc/feigbot/IRC)
    ==22675==
    ==22675== Conditional jump or move depends on uninitialised value(s)
    ==22675== at 0x4027FE41: _IO_vfprintf (in /lib/libc-2.2.5.so)
    ==22675== by 0x4029B8C9: __vsnprintf (in /lib/libc-2.2.5.so)
    ==22675== by 0x804A340: irc_send (in /var/irc/feigbot/IRC)
    ==22675== by 0x8049D77: irc_join (in /var/irc/feigbot/IRC)
    ==22675==
    ==22675== Use of uninitialised value of size 4
    ==22675== at 0x4027FF7E: _IO_vfprintf (in /lib/libc-2.2.5.so)
    ==22675== by 0x4029B8C9: __vsnprintf (in /lib/libc-2.2.5.so)
    ==22675== by 0x804A340: irc_send (in /var/irc/feigbot/IRC)
    ==22675== by 0x8049D77: irc_join (in /var/irc/feigbot/IRC)
    ==22675==
    ==22675== ERROR SUMMARY: 33 errors from 3 contexts (suppressed: 6 from 1)
    ==22675==
    ==22675== 11 errors in context 1 of 3:
    ==22675== Use of uninitialised value of size 4
    ==22675== at 0x4027FF7E: _IO_vfprintf (in /lib/libc-2.2.5.so)
    ==22675== by 0x4029B8C9: __vsnprintf (in /lib/libc-2.2.5.so)
    ==22675== by 0x804A340: irc_send (in /var/irc/feigbot/IRC)
    ==22675== by 0x8049D77: irc_join (in /var/irc/feigbot/IRC)
    ==22675==
    ==22675== 11 errors in context 2 of 3:
    ==22675== Conditional jump or move depends on uninitialised value(s)
    ==22675== at 0x4027FE41: _IO_vfprintf (in /lib/libc-2.2.5.so)
    ==22675== by 0x4029B8C9: __vsnprintf (in /lib/libc-2.2.5.so)
    ==22675== by 0x804A340: irc_send (in /var/irc/feigbot/IRC)
    ==22675== by 0x8049D77: irc_join (in /var/irc/feigbot/IRC)
    ==22675==
    ==22675== 11 errors in context 3 of 3:
    ==22675== Conditional jump or move depends on uninitialised value(s)
    ==22675== at 0x804C41E: handle_user_message (in /var/irc/feigbot/IRC)
    ==22675== by 0x8049CAD: irc_parse (in /var/irc/feigbot/IRC)
    ==22675== by 0x804A4C7: irc_receive (in /var/irc/feigbot/IRC)
    ==22675== by 0x804A2F2: irc_loop (in /var/irc/feigbot/IRC)
    --22675--
    --22675-- supp: 6 libc-2.2.4.so/libc-2.2.4.so/libc-2.2.4.so(Value4)
    ==22675==
    ==22675== IN SUMMARY: 33 errors from 3 contexts (suppressed: 6 from 1)
    ==22675==
    ==22675== malloc/free: in use at exit: 0 bytes in 0 blocks.
    ==22675== malloc/free: 233004 allocs, 233004 frees, 20865726 bytes allocated.
    ==22675==
    ==22675== No malloc'd blocks -- no leaks are possible.
    --22675-- TT/TC: 0 tc sectors discarded.
    --22675-- 2141 chainings, 0 unchainings.
    --22675-- translate: new 2812 (42075 -> 600942; ratio 142:10)
    --22675-- discard 0 (0 -> 0; ratio 0:10).
    --22675-- dispatch: 248450000 jumps (bb entries), of which 100308455 (40%) were unchained.
    --22675-- 665233/18351966 major/minor sched events. 245839 tt_fast misses.
    --22675-- reg-alloc: 327 t-req-spill, 112060+1450 orig+spill uis, 13220 total-reg-r.
    --22675-- sanity: 334959 cheap, 13399 expensive checks.
    --22675-- ccalls: 13883 C calls, 59% saves+restores avoided (48840 bytes)
    --22675-- 17747 args, avg 0.90 setup instrs each (3242 bytes)
    --22675-- 0% clear the stack (41649 bytes)
    --22675-- 4441 retvals, 34% of reg-reg movs avoided (2954 bytes)

    Die Fehler von handle_user_message kann man "übersehen". Ich denke mal ich weiß, wodran es liegt.

    Hat jemand eine Idee, wo genau der Fehler liegen kann ? Ich werde nachher mal if(!text) return; in die Funktion oben machen, aber eigentlich kann text nicht leer sein 😕

    Wäre super, wenn mir jemand helfen könnte.
    P.S. Falls etwas unklar sein sollte oder mehr Infos gebraucht werden, werde ich die gerne posten.

    €dit: Also der Fehler tritt auch bei if(!text) return; auf. Jetzt bin ich ganz ratlos 😕



  • Sorry, ich habe valgrind noch nie verwendet - ich kann mit diesem Log also nicht allzuviel anfangen - und um mich da wirklich reinzudenken fehlt mir die Motivation.

    Könntest du die Fehler die valgrind meldet auf deutsch zusammenfassen? Am besten auch worauf sich der Fehler bezieht.



  • Ich vermisse das va_arg in deinem Programm.



  • Geo schrieb:

    Ich vermisse das va_arg in deinem Programm.

    Ne, das ist nicht nötig.

    Er übergibt die va_list ja direkt an vsprintf - in vsprintf wird dann das va_arg gemacht.



  • €dit:

    habs jetzt "selber" gelöst. Scheinbar ist ein Argument, welches ich mit irc_send angebe, also z.b. hierbei irc_send("bla %s", text); -> "text" nicht initialisiert. Mal gucken, was genau die Probleme macht 🙂
    Trotzdem thx für die Hilfe.

    Shade Of Mine schrieb:

    Sorry, ich habe valgrind noch nie verwendet - ich kann mit diesem Log also nicht allzuviel anfangen - und um mich da wirklich reinzudenken fehlt mir die Motivation.

    Könntest du die Fehler die valgrind meldet auf deutsch zusammenfassen? Am besten auch worauf sich der Fehler bezieht.

    Naja, Valgrind meldet mir das hier:

    ==22675== Conditional jump or move depends on uninitialised value(s)
    ==22675== at 0x4027FE41: _IO_vfprintf (in /lib/libc-2.2.5.so)
    ==22675== by 0x4029B8C9: __vsnprintf (in /lib/libc-2.2.5.so)
    ==22675== by 0x804A340: irc_send (in /var/irc/feigbot/IRC)
    ==22675== by 0x8049D77: irc_join (in /var/irc/feigbot/IRC)

    und

    ==22675== Use of uninitialised value of size 4
    ==22675== at 0x4027FF7E: _IO_vfprintf (in /lib/libc-2.2.5.so)
    ==22675== by 0x4029B8C9: __vsnprintf (in /lib/libc-2.2.5.so)
    ==22675== by 0x804A340: irc_send (in /var/irc/feigbot/IRC)
    ==22675== by 0x8049D77: irc_join (in /var/irc/feigbot/IRC)

    Also dass bei "vsnprintf(buffer, sizeof(buffer), text, va);" irgendwo ein Fehler sein soll. Entweder ein bedingter Sprung oder ein Verschiebung (ka, ob das das richtige Wort für move ist) einer uninitialisierten Variable. Leider ist in irc_send keine Variable uninitialisiert, daher weiß ich nicht, wie ich da weiter kommen soll 😕


Anmelden zum Antworten