Unexpected path of execution

Adam D Ruppe destructionator at gmail.com
Tue Oct 19 16:38:50 UTC 2021


On Tuesday, 19 October 2021 at 16:20:39 UTC, Charles Hixson wrote:
> given this code fragment:
>
>             if    (i < (line.length - 3) )
>
> in c4: i = 0, line.length = 2

line.length is an unsigned value. Arithmetic on an unsigned thing 
is still unsigned.

So UNSIGNED 2 - 3 is not -1, but instead it is size_t.max since 
it rolls over.

Then the comparison also becomes unsigned. So 0 < size_t.max is 
true, meaning it goes in there.


you should be able to fix it if you do

  if(i < (cast(int) line.length) - 3)

to force it to become signed. But this isn't great either. You 
probably want to  change the code to avoid going negative in the 
first place. Maybe test `i + 3 < line.length` instead. Or maybe 
`if(!(i > ... wahtever that is)`. You get the idea im brain 
farting.


I personally hate that array.length is unsigned. And I hate that 
the signed/unsigned mixing prefers unsigned instead of just about 
anything else. What a pain in the butt. But that's how it is.


More information about the Digitalmars-d-learn mailing list