Sida 1 av 1

GRRRR GCC, PIC32 Varning vid kompilering

Postat: 15 januari 2013, 13:17:28
av TomasL
Får följande varning vid kompilering, kan inte begripa varför

Kod: Markera allt

warning: incompatible implicit declaration of built-in function 'memset'
Anropet ser ut så här:

Kod: Markera allt

memset( pxNewTCB->pxStack, ( int ) tskSTACK_FILL_BYTE, ( size_t ) usStackDepth * sizeof( portSTACK_TYPE ) );
string.h är inkluderad.
Vad jag kan se så följer anropet boken.
memset är definierad i string.h som

Kod: Markera allt

extern void * memset(void *, int, size_t);

Re: PIC32 Varning vid kompilering

Postat: 16 januari 2013, 20:21:42
av dangraf
hej!
har du testat sätta parentes runt hela uttrycken vid casting, (int) (a*b) ibland tar castingen bara första uttrycket dvs att (int) a * b konverterar a till en int men att hela uttrycket blir av typen long.

Har du testat att se om andra funktioner i string.h fungerar som de ska? tänkte om kompilatorn kanske hittar header-filen men att libet saknas.

Re: PIC32 Varning vid kompilering

Postat: 16 januari 2013, 23:34:08
av sodjan
Så här har jag förstått...

Om man använder en funktion som inte är deklarerad (i samma kod eller via
en header fil) så får man "warning: implicit declaration" och returvärdet
blir default "int". Om man accepterar varningen så är det helt OK, annars
importerar man en lämplig header fil eller lägger till en egen deklaration.

Vissa funktioner kan ha en intern deklaration i själva kompilatorn, och
om den inte stämmer överen med den automatgenererade så får man
"warning: incompatible implicit declaration". T.ex ifall memset()
internt är definierad som void.

Kör en full listfil och verifiera att string.h är korrekt importerad.
Du kan även testa att kopiera raden från string.h till din c fil.

Re: PIC32 Varning vid kompilering

Postat: 17 januari 2013, 01:21:50
av TomasL
Det visade sig vara en i gcc inbyggd funktion, vars deklaration inte stämmer med gängse vedertaget sätt, en kompilatorswitch fixade det.
Men varför i helsike gör man inte så att inbyggda funktioner är definierade som "weak", då slipper man alla problem.

Re: PIC32 Varning vid kompilering

Postat: 17 januari 2013, 11:52:18
av sodjan
Hade det inte också "lösts" om du hade anropat memset()
på så sätt som GCC förväntade sig?

Re: PIC32 Varning vid kompilering

Postat: 17 januari 2013, 12:01:14
av TomasL
Nja, gillar inte att använda "odokumenterade" funktioner, anser att man skall använda libben i stället, man har liksom lite större kontroll på saker och ting.
Personligen så anser jag att sådana Built-in funktioner skall vara "weak", så man utan problem kan ersätta dem rakt av med en include, utan att behöva ändra i kod.
dessutom vill man ju gärna att koden skall vara porterbar och sann ansi, vilket den inte blir om kompilatorn har egna inbyggda funktioner, vilka skiljer sig från ansi-liben.

Re: PIC32 Varning vid kompilering

Postat: 17 januari 2013, 12:04:50
av sodjan
Jag tog det som självklart att memset() är/var dokumenterad!
*Det* har ju inget med hur den är implementerad...

Portabiliteten håller jag med om, så länge som inbygda
funktioner inte ingår i standarden som sådan (som tex i Fortran).

Re: GRRRR GCC, PIC32 Varning vid kompilering

Postat: 17 januari 2013, 12:37:33
av TomasL
I ansiliben är memset deklarerad som en "void *" i gcc verkar det bara vara en "void".
Det är säkert dokumenterat in någon kryptisk obskyr dokumentation någonstans.

Men oavsett vilket så bryter sådana här egenheter portabiliteten, och som sagt den borde vara weak, så om man inkluderar ett libb med motsvarande funktioner, så skall det överrida de interna funktionerna.

Re: GRRRR GCC, PIC32 Varning vid kompilering

Postat: 18 januari 2013, 22:38:31
av dangraf
Men om man deklarerar den som weak, då finns den väl där alltid även om man glömt lägga till sitt lib
In computing, a weak symbol is a symbol definition in an object file or dynamic library that may be overridden by other symbol definitions. Its value will be zero if no definition is found by the loader.
Då kan man av misstag kalla på funktioner som inte finns vilket kan vara ganska farligt.

Eller har jag missförstått?

Re: GRRRR GCC, PIC32 Varning vid kompilering

Postat: 18 januari 2013, 22:45:18
av TomasL
Finns inte funktionerna deklarerade får du felmeddelande, finns de deklarerade men du anropar dem med fel typer, som i mitt fall får du en varning/felmeddelande beroende på inställning.
Så som jag uppfattat det, om den är deklarerad som weak, och jag inkluderar ett lib, så överrider libbet den svagt deklarerade symbolen, i detta fallet de inbyggda funktionerna eftersom jag inkluderade libben i stället.
Nåväl, med en kompilatorswitch kan man stänga av de inbyggda funktionerna, så det löste sig. Ingen blå text längre.