Re: g++ -fwrapv
Witam,
przyznam się, że nie wiem jak działa wrapv, ale co trapv wydaje mi się, że
wszystko jest ok:
On Thu, 23 Mar 2006, Efrum wrote:
[...]
tohver@Su30:~/mpi$ cat test.cpp
#include <iostream>
int main() {
int i = 2147483648;
i++;
printf("%d\n", i);
return i;
}
tohver@Su30:~/mpi$ g++ -ftrapv test.cpp
tohver@Su30:~/mpi$ ./a.out
-2147483647
Jeżeli dobrze rozumiem mana te opcje powinny zapobiegać obu przypadkom. O co
chodzi?
Przekraczasz zakres w swoim kodzie podczas inicjalizacji:
i=2147483648 to tak naprawdę i=-2147483648 (zakres int to przecież
-2147483648 do 2147483647).
i++ zmienia wartość z -2147483648 na -2147483647, czyli jest ok, zakres
nie zostaje przekroczony.
Jeśli zainicjalizujesz i wartością 2147483647 to będziesz mógł
zaobserwować, że przy dodaniu opcji -ftrapv przekroczenie zakresu zostanie
zaraportowane, a bez tej opcji już nie:
mazak@toy:~/tests$ cat t2.cpp
#include <iostream>
int main() {
int i = 2147483647;
printf("%d\n", i);
i++;
printf("%d\n", i);
return i;
}
mazak@toy:~/tests$ g++-3.4 t2.cpp
mazak@toy:~/tests$ ./a.out
2147483647
-2147483648
mazak@toy:~/tests$ g++-3.4 -ftrapv t2.cpp
mazak@toy:~/tests$ ./a.out
2147483647
Przerwane
Pozdrawiam,
Marek
--
"Ze wzoru na moje życie wyliczę sobie w niebycie nowy los"
(Raz, Dwa, Trzy)
Reply to: