c - Er forsætlig værdi overløb sikker?

Indlæg af Hanne Mølgaard Plasc

Problem



Dette spørgsmål er sandsynligvis dumt eller paranoidt, men alligevel :-). Givet følgende kode:


DWORD hiRes;

// will overflow about once in an hour
hiRes = GetTickCount() * 1193L;


Hvis det vides at hiRes overløb regelmæssigt, og sådanne situationer håndteres korrekt, er der noget galt med denne kode?


UPDATE:
Resultatet er ganske overraskende for mig, da svaret afhænger af typen hiRes (signeret eller usigneret), som er defineret af C Standard (se for eksempel). [6]

Bedste reference


Overflow en unsigned int er sikker. Overstrømning af en signeret er ikke (udefineret adfærd).


MSDN siger: [7]



  En DWORD er et 32-bit usigneret heltal (interval: 0 til 4294967295
  decimal). Denne type erklæres som følger:


typedef unsigned long DWORD



Så det skal være sikkert.

Andre referencer 1


Unsigned heltal er sikre, underskrevet er ikke. Men jeg har aldrig kommet over en platform, der ikke gør det indlysende to komplement ting. Jeg ønsker de standarder folk havde bidt kuglen og netop gjort det obligatorisk.