[SOLVED] c kód ellenőrzés

Fórumok

A következő lenne a kérdés: milyen programmal lehet ellenőrizni, hogy leak-e egy program, ami nem valgrind? Merthogy ez utóbbi egy nagy bughalmaz, ha épp nem crash-el, akkor is olyan memóriákra sír, amik felszabadításra kerülnek.

Példa valgrind crash-re:

==6683== Memcheck, a memory error detector.
==6683== Copyright (C) 2002-2007, and GNU GPL'd, by Julian Seward et al.
==6683== Using LibVEX rev 1854, a library for dynamic binary translation.
==6683== Copyright (C) 2004-2007, and GNU GPL'd, by OpenWorks LLP.
==6683== Using valgrind-3.3.1-Debian, a dynamic binary instrumentation framework.
==6683== Copyright (C) 2000-2007, and GNU GPL'd, by Julian Seward et al.
==6683== For more details, rerun with: -v
==6683==
==6683==
==6683== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 13 from 1)
==6683== malloc/free: in use at exit: 121,292,077 bytes in 2,713,074 blocks.
==6683== malloc/free: 3,449,783 allocs, 736,709 frees, 4,286,394,186 bytes allocated.
==6683== For counts of detected errors, rerun with: -v

Memcheck: mc_leakcheck.c:710 (vgMemCheck_do_detect_memory_leaks): Assertion '(lc_shadows[i]->data + lc_shadows[i]->szB <= lc_shadows[i+1]->data ) || (lc_shadows[i]->data =adows[i+1]->data && lc_shadows[i]->szB == lc_shadows[i+1]->szB)' failed.
==6683== at 0x3801A41D: report_and_quit (m_libcassert.c:140)
==6683== by 0x3802B5CE: vgPlain_do_syscall (m_syscall.c:463)
==6683== by 0x3: ???
==6683== by 0x3F7: ???
==6683== by 0x626A7007: ???
==6683== by 0x59: ???

Példa olyan memóriakezelésre, amit nem képes követni:

mystruct **mylist=NULL;
int bennevan_hanincsaddhozza()
{
mystruct *ms=malloc(sizeof(mystruct);
i=keres(mylist,ms);
if(i==-1) { //nincs benne
i=pozicio_beszor(mylist,ms);
mylist[i]=ms;
}
//direkt nincs free(ms), mert akkor a mylistben halott pointer lenne!
}

//helyette egy masik fgv vegzi a felszabaditast
int regiek_torol()
{
for(i=0;i<mylist_length;i++) if(nemkellmar(mylist[i])) free(mylist[i]);
}

Magyarán ha van egy pointerlistád, amibe az egyik függvény berak lefoglalt memória pointereket, egy másik függvény meg felszabadítja ha már nem kell, akkor a valgrind csődöt mond. Na de bazz. Nem olyan ritka dolog, hogy nem egy kódblokkon belül kerül lefoglalásra és felszabadításra egy memória....

Szóval a kérdés: milyen alternatívák léteznek?

Hozzászólások

allitsd NULL-ra az ms-t, miutan hozzaadtad a mylist[]-hez, es akkor nem fog kohogni
___
info

Köszönöm a válaszokat! Megnézegetem, amiket írtatok.
(Az alap probléma egyébként az, hogy x idő után lefagy a program, de annyira, hogy még signal-okra sem reagál. További baj, hogy ugyanarra az inputra egyszer lefut, egyszer nem. Memory corruptionre gyanakszom, de nem biztos).

o"o"o", igen, azert a leak meg a hardcore fagya's azert mas kategoria ;)

ha -g-vel forditod a programodat, akkor a valgrind nem viselkedik jobban? sima mezei segfaultozasnal ez eddig mindig bevalt, kiirta hogy melyik modul hanyadik soraban hasal, oszt akkor jo (-g nelkul meg talan csak a fv-t tudja behatarolni es/vagy a stack trace-t irja ki). optimalizalasi szint valtoztatasara hogy reagal? -O3-mal forditasz vagy ennyire azert nem durvitod a helyzetet?

Eredmény:
-ibm-es motyóhoz reg kell, úgyhogy azt kihagytam
-clang-ot sem sikerült belőni (most nem mac-en vagyok), de majd még ránézek otthon
-cppcheck nem jelzett hibát, még -a kapcsolóval sem (egyébként a gcc -Wall sem mond semmit)
-"ms=NULL" tényleg megszüntette a valgrind fals riasztásait, a problémát azonban nem orvosolta :-(

Szóval ugyanott vagyok, ahol tartottam (néha fagy). Azért köszönöm a tippeket!

Szerk: pontosítanék, az "ms=NULL" hatására van olyan futás, mikor nem reklamál a valgrind, de nem mindig. Jó kis program ez...!

gyébként a gcc -Wall sem mond semmit
-O3? ez is sok warningot kihoz:

x.c:


#include <stdio.h>

int main(int argc,char *argv[])
{
 int a;
 printf("%d\n",a);
 return(0);
}

forditas:


$ gcc -Wall -o x x.c
$ gcc -Wall -O3 -o x x.c
x.c: In function 'main':
x.c:6: warning: 'a' is used uninitialized in this function
$

Megvan, kernel bug miatt fagy le. A libc meghív egy futex-et, ami aztán beáll, mint a rajzszög.


# strace -p1111
Process 1111 attached - interrupt to quit
futex(0x33c374f9a0, FUTEX_WAIT, 2, NULL) = -1 EINTR (Interrupted system call)
--- SIGINT (Interrupt) @ 0 (0) ---
futex(0x33c374f534, FUTEX_WAIT, 2, NULL
Process 1111 detached
#

Ctrl+C-re a kernel-t szakítja meg, ezért nem jut el a signal a programhoz. Áu.