TCH (statz) | #1, Főfasz (10466) |
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. |