Unsigned
-
rüdiger schrieb:
(wer sieht den Fehler?)
if(abs(n) >= SIZE) ...müsste sein:
if(abs(n) > SIZE)hat aber mit dem eigentlichen thema hier nix zu tun...

-
ten schrieb:
rüdiger schrieb:
(wer sieht den Fehler?)
if(abs(n) >= SIZE) ...müsste sein:
if(abs(n) > SIZE)hat aber mit dem eigentlichen thema hier nix zu tun...

ne
int a[5]; a[5]=10; // <-- das wäre ja auch ein Overflow
-
rüdiger schrieb:
int a[5]; a[5]=10; // <-- das wäre ja auch ein Overflowdas meine ich ja auch...

-
ten schrieb:
rüdiger schrieb:
int a[5]; a[5]=10; // <-- das wäre ja auch ein Overflowdas meine ich ja auch...

nö, davor ist es ja abgesichert, das n == SIZE
-
ach ja, mist

so ist's besser...void foo (int n) { char buffer[SIZE]; int a = abs(n) if(a < SIZE) do_sth(buffer[a]); }abs sorgt dafür, dass a nicht negativ wird.
ok, dein beispiel ist sehr wohl relevant für dieses thema.
hat mich voll verwirrt, kein vernünftiger mensch nimmt für sowas einen 'signed' typ
-
der Code hat immer noch den Fehler, auf den ich hinaus will

-
rüdiger schrieb:
der Code hat immer noch den Fehler, auf den ich hinaus will

wieso

wenn a<SIZE und a=abs(n) dann heisst das doch 0<=a<SIZE
oder nicht?
-
ten schrieb:
rüdiger schrieb:
der Code hat immer noch den Fehler, auf den ich hinaus will

wieso

wenn a<SIZE und a=abs(n) dann heisst das doch 0<=a<SIZE
oder nicht?Die Frage ist ja, ob abs in jedem Fall einen positiven Wert zurück gibt. Was ist das Ergebnis von abs(INT_MIN)?

-
rüdiger schrieb:
Was ist das Ergebnis von abs(INT_MIN)?

doch wohl kein negativer wert, oder?
-
ten schrieb:
rüdiger schrieb:
Was ist das Ergebnis von abs(INT_MIN)?

doch wohl kein negativer wert, oder?
oder?
-
rüdiger schrieb:
ten schrieb:
rüdiger schrieb:
der Code hat immer noch den Fehler, auf den ich hinaus will

wieso

wenn a<SIZE und a=abs(n) dann heisst das doch 0<=a<SIZE
oder nicht?Die Frage ist ja, ob abs in jedem Fall einen positiven Wert zurück gibt. Was ist das Ergebnis von abs(INT_MIN)?

Ich vermute mal INT_MAX-1
-
ten schrieb:
rüdiger schrieb:
Was ist das Ergebnis von abs(INT_MIN)?

doch wohl kein negativer wert, oder?
Es ist Implementierungsabhängig. Aber auf vielen Plattformen dürfte abs(INT_MIN) == INT_MIN sein.
Man sieht also, das es nicht ganz ungefährlich ist, wenn man signed Variablen benutzt, wo man unsigned benutzen sollte.
(Ganz zu schweigen von dem Problem, das man mit size_t ein fertiges typedef für Größenangaben hat und keineswegs gelten muss sizeof(size_t) == sizeof(int) (siehe zB AMD64))
-
EDIT: Totaler Unsinn.
-
Hier ist noch mal ein Text, der darauf eingeht, wie man Integer-Probleme (unter anderem auch Signed/Unsigned-Probleme) zum Exploiten von Programmen benutzen kann http://www.phrack.org/archives/60/p60-0x0a.txt