-
1. Data: 2010-12-29 11:50:20
Temat: Czy da się stwierdzić błąd "integer/floating overflow" v C++/ Visual Studio ?
Od: "KrisB" <...@...pl>
Coś czytałem na necie że C tego nie ma wbudowanego, ale nie chce mi się wierzyć.
Nie ma jakiejś opcji kompilera (VStudio 2010 Ultimate) która by dodawała dodatkowy
kod do kompilacji, który by informował mnie że
nastąpiło przepełnienie typu liczbowego ?
Jeśli nie od razu w momencie przepełnienia, to przynajmniej po wykonaniu całego
programu ?
Bo nie muszę tłumaczyć że jeśli taki błąd wystąpił przy liczeniu to cały wynik jest
bez sensu, a chciałbym się przynajmniej
dowiedzieć czy był ?
Krzys
-
2. Data: 2010-12-31 11:35:11
Temat: Re: Czy da się stwierdzić błąd
Od: " " <k...@g...SKASUJ-TO.pl>
KrisB <...@...pl> napisał(a):
>
> Coś czytałem na necie że C tego nie ma wbudowanego, ale nie chce mi się wierzyć
> .
> Nie ma jakiejś opcji kompilera (VStudio 2010 Ultimate) która by dodawała dodatk
> owy kod do kompilacji, który by informował mnie że
> nastąpiło przepełnienie typu liczbowego ?
Dla liczb zmiennoprzecinkowych mozna: http://www.devx.com/cplus/Article/34993/1954
Dla integers, chyba nie bardzo:
http://stackoverflow.com/questions/199333/best-way-t
o-detect-integer-overflow-in-c-c
KK
--
Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/
-
3. Data: 2010-12-31 14:09:31
Temat: Re: Czy da się stwierdzić błąd
Od: "Wojciech \"Spook\" Sura" <s...@s...please.op.pl>
Dnia 31-12-2010 o 12:35:11 <k...@g...skasuj-to.pl>
napisał(a):
> Dla integers, chyba nie bardzo:
> http://stackoverflow.com/questions/199333/best-way-t
o-detect-integer-overflow-in-c-c
int __stdcall safeAdd(int i, int j)
{
int result;
bool _valid;
__asm
{
mov EAX, i;
mov EBX, j;
add EAX, EBX;
jo overflow;
mov _valid, 1;
jmp end;
overflow:
mov _valid, 0;
end:
mov result, EAX;
}
if (_valid)
printf("Added, result = %d\n", result);
else
printf("Overflow occured!\n");
return result;
}
int main(int argc, char * argv[])
{
bool valid;
int i = safeAdd(2147483646, 1);
int j = safeAdd(2147483646, 2);
getchar();
}
Przy czym są prostsze sposoby :)
> KK
Pozdrawiam -- Spook.
--
Używam klienta poczty Opera Mail: http://www.opera.com/mail/
-
4. Data: 2010-12-31 14:43:08
Temat: Re: Czy da się stwierdzić błąd
Od: Tomasz Sowa <t...@t...NOSPAM.org>
Dnia Fri, 31 Dec 2010 15:09:31 +0100, Wojciech "Spook" Sura napisał(a):
> Przy czym są prostsze sposoby :)
No można bez instrukcji skoku :)
int __stdcall safeAdd(int i, int j)
{
int result;
int _valid;
#ifndef __GNUC__
__asm
{
mov EAX, i
mov EBX, j
add EAX, EBX
mov ebx, 0
seto bl
mov _valid, ebx
mov result, EAX
}
#else
__asm__ __volatile__(
"add %%ebx, %%eax \n"
"mov $0, %%ebx \n"
"seto %%bl \n"
: "=a" (result), "=b" (_valid)
: "0" (i), "1" (j)
: "cc" );
#endif
if ( _valid == 0 )
printf("Added, result = %d\n", result);
else
printf("Overflow occured!\n");
return result;
}
--
Tomek
http://www.ttmath.org
-
5. Data: 2010-12-31 15:37:15
Temat: Re: Czy da się stwierdzić błąd
Od: " " <k...@g...SKASUJ-TO.pl>
Wojciech \Spook\ Sura <s...@s...please.op.pl> napisał(a):
> Dnia 31-12-2010 o 12:35:11 <k...@g...skasuj-to.pl> =
[...]
> Przy czym s=B1 prostsze sposoby :)
No fajnie, ale to juz nie jest czyste C ;-)
KK
--
Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/
-
6. Data: 2010-12-31 16:38:11
Temat: Re: Czy da się stwierdzić błąd
Od: Mariusz Marszałkowski <m...@g...com>
On 31 Gru, 15:09, "Wojciech \"Spook\" Sura"
<s...@s...please.op.pl> wrote:
> Dnia 31-12-2010 o 12:35:11 <k...@g...skasuj-to.pl>
> mov EAX, i;
> mov EBX, j;
> add EAX, EBX;
> jo overflow;
> mov _valid, 1;
> jmp end;
Czasami brakuje dostepu do flag na poziomie jezyka.
Pozdrawiam