Kent Friis wrote:
> Den Thu, 2 Nov 2006 20:12:01 +0100 skrev news.tele.dk:
>> Hej igen
>>
>> Det skal være et Lint værktøj. Altså et værtøj der er i stand til at lave
>> "warnings" når den fanger ting som normale compiler ignorere. Det kunne jo
>> fx. være ting som brug af unititaliserede variabler
>
> DÃ¥rligt eksempel, brug af uinitaliserede variable kan enhver ordentlig
> compiler advare om.
I så fald er gcc ikke en ordentlig compiler, medmindre jeg har overset
noget.
Tag f.eks. flg:
typedef struct
{
int bar;
}foo;
int main(int argc, char* argv[]){
foo a,*ptr;
int b,c;
b = a.bar;
ptr = malloc(10*sizeof(foo));
if (ptr[0].bar)
return c;
free(ptr);
return b;
}
gcc -g -Wall -O3 -o test test.c
test.c: In function ‘main’:
test.c:17: warning: ‘c’ is used uninitialized in this function
test.c:9: warning: ‘a.bar’ may be used uninitialized in this function
gcc advarer godt nok om 'c' og 'a.bar', men ikke om ptr[0].bar, som
bliver brugt uinitialiseret.
Kører man derimod valgrind på overnstående:
valgrind --leak-check=yes ./test
--snip--
==3854== Conditional jump or move depends on uninitialised value(s)
==3854== at 0x80483E6: main (test.c:16)
==3854==
==3854== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 12 from 1)
==3854== malloc/free: in use at exit: 0 bytes in 0 blocks.
==3854== malloc/free: 1 allocs, 1 frees, 40 bytes allocated.
==3854== For counts of detected errors, rerun with: -v
==3854== No malloc'd blocks -- no leaks are possible.
får man en advarsel. Jeg tror det er denne slags fejl Mikael mener når
han skriver "uinitialiseret". De er rare at finde (og rette)
Mvh
Simon