www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Unexpected path of execution

reply Charles Hixson <charleshixsn earthlink.net> writes:
given this code fragment:

             if    (i < (line.length - 3) )
             {    writeln ("in c4: i = ", i, ", line.length = ", 
line.length);
                   add2 (c4, line [i..i+4]);
I get this result:

in c4: i = 0, line.length = 2
core.exception.RangeError source/freqs.d(32): Range violation
----------------
??:? _d_arrayboundsp [0x56041325a70d]
??:? _Dmain [0x560413233beb]

Why did this get executed?  The if test was supposed to prevent this.

DMD64 D Compiler v2.097.2

-- 
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.
Oct 19 2021
next sibling parent reply Adam D Ruppe <destructionator gmail.com> writes:
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.
Oct 19 2021
next sibling parent Adam D Ruppe <destructionator gmail.com> writes:
On Tuesday, 19 October 2021 at 16:38:50 UTC, Adam D Ruppe wrote:
 test `i + 3 < line.length` instead
BTW this is my personal preference, I have gotten into the habit of using this style tests with lengths all the time now.
Oct 19 2021
prev sibling parent Charles Hixson <charleshixsn earthlink.net> writes:
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.
Oct 19 2021
prev sibling parent reply Dennis <dkorpel gmail.com> writes:
On Tuesday, 19 October 2021 at 16:20:39 UTC, Charles Hixson wrote:
 core.exception.RangeError source/freqs.d(32): Range violation
 ----------------
 ??:? _d_arrayboundsp [0x56041325a70d]
 ??:? _Dmain [0x560413233beb]
 DMD64 D Compiler v2.097.2
By the way, if you upgrade to 2.098.0, you get a better error message for out of bounds array access.
Oct 19 2021
parent reply Steven Schveighoffer <schveiguy gmail.com> writes:
On 10/19/21 12:49 PM, Dennis wrote:
 On Tuesday, 19 October 2021 at 16:20:39 UTC, Charles Hixson wrote:
 core.exception.RangeError source/freqs.d(32): Range violation
 ----------------
 ??:? _d_arrayboundsp [0x56041325a70d]
 ??:? _Dmain [0x560413233beb]
 DMD64 D Compiler v2.097.2
By the way, if you upgrade to 2.098.0, you get a better error message for out of bounds array access.
context: https://dlang.org/changelog/2.098.0.html#range-error OMG I've wanted this for so long! Awesome! -Steve
Oct 19 2021
parent Imperatorn <johan_forsberg_86 hotmail.com> writes:
On Tuesday, 19 October 2021 at 17:06:35 UTC, Steven Schveighoffer 
wrote:
 On 10/19/21 12:49 PM, Dennis wrote:
 On Tuesday, 19 October 2021 at 16:20:39 UTC, Charles Hixson 
 wrote:
 core.exception.RangeError source/freqs.d(32): Range violation
 ----------------
 ??:? _d_arrayboundsp [0x56041325a70d]
 ??:? _Dmain [0x560413233beb]
 DMD64 D Compiler v2.097.2
By the way, if you upgrade to 2.098.0, you get a better error message for out of bounds array access.
context: https://dlang.org/changelog/2.098.0.html#range-error OMG I've wanted this for so long! Awesome! -Steve
The day has come! 😍
Oct 19 2021