Re: Unexpected path of execution

2021-10-19 Thread Imperatorn via Digitalmars-d-learn
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! 😍


Re: Unexpected path of execution

2021-10-19 Thread Steven Schveighoffer via Digitalmars-d-learn

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


Re: Unexpected path of execution

2021-10-19 Thread Charles Hixson via Digitalmars-d-learn
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.



Re: Unexpected path of execution

2021-10-19 Thread Dennis via Digitalmars-d-learn

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.




Re: Unexpected path of execution

2021-10-19 Thread Adam D Ruppe via Digitalmars-d-learn

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.


Re: Unexpected path of execution

2021-10-19 Thread Adam D Ruppe via Digitalmars-d-learn

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.


Re: Unexpected path of execution

2021-10-19 Thread H. S. Teoh via Digitalmars-d-learn
On Tue, Oct 19, 2021 at 09:20:39AM -0700, Charles Hixson via 
Digitalmars-d-learn wrote:
> 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.
[...]

Could you post a compilable snippet that exhibits the same problem?  The
incomplete code fragment above doesn't really tell us very much about
what the problem might be.


T

-- 
Life would be easier if I had the source code. -- YHL


Unexpected path of execution

2021-10-19 Thread Charles Hixson via Digitalmars-d-learn

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.