Unexpected path of execution

Charles Hixson charleshixsn at earthlink.net
Tue Oct 19 16:57:49 UTC 2021


Thank you.  That seems to have solved the problem (bar additional 
testing).  And also thanks for your recommendation to add to the index 
rather than casting the length.  It wasn't as "nice" to my eyes at 
first, but it's a cleaner answer.

On 10/19/21 9:38 AM, Adam D Ruppe via Digitalmars-d-learn wrote:
> 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.

-- 
Javascript is what you use to allow third part programs you don't know anything about and doing you know not what to run on your computer.



More information about the Digitalmars-d-learn mailing list