Stavo riscontrando alcuni problemi con un codice di esempio che stavo testando, poiché la funzione abs non restituiva il risultato corretto. abs (-2) è stato outputing -2 (questo, tra l'altro, si suppone sia la funzione valore assoluto, se era chiaro)conflitto nome funzione GCC
Dopo aver ottenuto un po 'disperata, alla fine ho avuto il seguente codice
#include <stdio.h>
unsigned int abs(int x) {
return 1;
}
int main() {
printf("%d\n", abs(-2));
return 0;
}
Questo non fa nulla di utile ma serve a mostrare il mio problema. Questo era in uscita -2, quando era previsto l'output 1.
se cambio il nome della funzione in qualcos'altro (ad esempio abs2), il risultato è ora corretto. Inoltre, se lo cambio per ricevere due argomenti invece di uno, risolve anche il problema.
La mia ipotesi ovvia: un conflitto con la funzione di standart abs. Ma questo non spiega ancora perché l'output è -2 (dovrebbe essere 2, se si utilizza la funzione standart abs). Ho provato a controllare l'uscita montaggio di entrambe le versioni (con la funzione denominata addominali e ABS2)
Ecco l'output diff per entrambi i montaggi:
23,25c23,25
< .globl abs
< .type abs, @function
< abs:
---
> .globl abs2
> .type abs2, @function
> abs2:
54c54
< .size abs, .-abs
---
> .size abs2, .-abs2
71c71,74
< movl -4(%rbp), %edx
---
> movl -4(%rbp), %eax
> movl %eax, %edi
> call abs2
> movl %eax, %edx
Da quanto ho capito, la prima versione (dove la funzione è chiamato abs) sta semplicemente scartando la chiamata di funzione, quindi utilizzando il parametro x invece di abs (x)
Quindi per riassumere: perché questo accade, soprattutto perché non sono riuscito a trovare un modo per ottenere alcun tipo di avviso o errore a riguardo.
Testato su Debian Squeeze, GGC 4.4.5, ed anche su gcc 4.1.2
ecco un esempio in ideone http://ideone.com/YpnkE –