[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

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: