[conspire] Cautionary tale: bad NTP client, bad NTP clock, bad date handling, C ints
Ivan Sergio Borgonovo
mail at webthatworks.it
Wed Mar 27 03:33:38 PDT 2024
On 3/27/24 2:01 AM, Rick Moen wrote:
> The 2038 problem happens because when the first bit of a 32-bit value is
> 1 and you use it as a signed integer, it’s interpreted as a negative
> number in 2’s complement representation. But C has no protection from
> treating the same value as signed in some contexts and unsigned in
> others. If you start with a signed 32-bit integer with the value -1, it
> is represented in memory as 0xFFFFFFFF. If you then use it as an
> unsigned integer, it becomes the value 4,294,967,296.
Oh to clarify... C has protection as shown in previous email against
mixing signed and non signed types... it doesn't have protection against
arithmetic overflow.
Some interpreted language just support "arbitrary precision", they just
extend the type. This not only has a cost, but generally doesn't make
your code safer.
Most of the times it is not intended you overflow, and eg. if you're
carrying on a long computation and an overflow will waste all your
previous computation, you'd probably better optimizing for the right
type. "arbitrary precision" should be a conscious choice/situation for a
specific set of problems (when you're really dealing with numbers with a
lot of digits and you want them ALL eg. crypto [*]) or left for prototyping.
Other like Rust will cause an exception in debug mode but behave like C
in release mode.
[*] you do math very differently and most of the times it's not a mater
of arbitrary length but rather length that don't fit in the CPU
registers. So again you optimize accordingly to the specific problem.
--
Ivan Sergio Borgonovo
https://www.webthatworks.it https://www.borgonovo.net
More information about the conspire
mailing list