| TCH (statz) | ![]() #1, Főfasz (10579) |
1975 | #2f84 | ^ | Idézet | Sat, 24 Jan 2015 21:09:21 +01 |
| 46.139.*.* |
|
*.catv.pool.telekom.hu |
Azért ostobaságért a CLangnak sem kell messzire mennie:#include <stdlib.h>
int main()
{
unsigned int x;
unsigned int y;
signed int z;
x = 800;
y = 400;
z = abs(y - x);
}root@Csabi:~# clang abstest.c
abstest.c:11:6: warning: taking the absolute value of unsigned type
'unsigned int' has no effect [-Wabsolute-value]
z = abs(y - x);
^
abstest.c:11:6: note: remove the call to 'abs' since unsigned values cannot be
negative
z = abs(y - x);
^~~
1 warning generated.Gratulálok. Mert ugye két jelöletlen szám kivonásának eredménye nem lehet negatív. 400 - 800 az nem negatív szám. Ha a célváltozó lenne jelöletlen, akkor még csak-csak mondhatanám, hogy igaza van, de bazdmeg, a célváltozó jelölt! Hát nem látja?! Mi a fárasnak kell berakni egy ilyen felesleges kamu-optim fasságot?Az rendben van, hogy ha abszolútértéket veszek, akkor a célváltozó jelöléstül függetlenül pozitív értéket fog felvenni, csakhogy ez nem számít, mert 400 - 800 = 0xfffffe70, ami jelöletlenül 4294966896, jelölten pedig -400, márpedig abs(400 - 800) = 0x00000190, ami jelölten és jelöletlenül is kurwára 400, tehát totál nem azt fogjuk kapni, amit kellene, ha kiszedi az abszolútértékszámítást! "Megoldás" így: #include <stdlib.h>
int main()
{
unsigned int x;
unsigned int y;
signed int z;
x = 800;
y = 400;
z = y - x;
z = abs(z);
}vagy így:#include <stdlib.h>
int main()
{
unsigned int x;
unsigned int y;
signed int z;
x = 800;
y = 400;
z = abs((signed int)(y - x));
}Az igazán fájdalmas az, hogy a fostos GCC ezt a szarvas hibát nem követi el. Viszont javára legyen mondva a CLangnak, hogy figyelmeztetett, mert a GCC viszont nem szokott figyelmeztetni semmiért, hanem slussz lenyeli a kód egy részét a gecibe, mert szerinte az nem kell. A CLang legalább szól, hogy lenyelte a kódot. De ez akkor is fail. |