I have now this function, as a private member in a Class :


        double calculate_lineLength( int i)  {
field.rawData [] * rd; // ignore the details, this works; rd = cast (field.rawData [] *) dataSet; // ignore the details, this works;

auto l = this.allLines[i]; // this is defined as // int [][] allLines = // new int [][] (0,0) // in case of failure, this is empty
            double r = 0;
            try {
                writeln("l ", l);                    // prints []
writeln("i ", i); // prints i, in this case, i is set to 0
                writeln(l.length);                   // prints 0
writeln("l0 ", l[0]); // segfault - i want it to be caught
                write("will print");
                writeln("rd", (*rd));
                write("will not print...");
                auto p0 = (*rd)[l[0]];
                auto p1 = (*rd)[l[1]];
r = calculate_geoDistance_vincenty(p0.lat,p1.lat, p0.lon, p1.lon);
            } catch (RangeError er) {
                writeln("range error");
            }
                return r;
        }


Compile with `dub build --compiler=ldc2 `. this should enable array bound checking options.


I am debugging with gdb :

`gdb ./myprogram`

Then, in gdb console :

`run arg1 arg2 `

Result is :

        91753
        91754
        91755
        91756
        [New Thread 0x7ffff7560640 (LWP 45344)]
        [New Thread 0x7fffeffff640 (LWP 45345)]
        [New Thread 0x7ffff6d5f640 (LWP 45346)]
        [New Thread 0x7ffff655e640 (LWP 45347)]
        [New Thread 0x7ffff5d5d640 (LWP 45348)]
        [New Thread 0x7ffff555c640 (LWP 45349)]
        [New Thread 0x7ffff4d5b640 (LWP 45350)]
        [New Thread 0x7fffef7fe640 (LWP 45351)]
        [New Thread 0x7fffeeffd640 (LWP 45352)]
        [New Thread 0x7fffee7fc640 (LWP 45353)]
        [New Thread 0x7fffedffb640 (LWP 45354)]
        [New Thread 0x7fffed7fa640 (LWP 45355)]
        [New Thread 0x7fffecff9640 (LWP 45356)]
        [New Thread 0x7fffbffff640 (LWP 45357)]
        [New Thread 0x7fffbf7fe640 (LWP 45358)]
        [New Thread 0x7fffbeffd640 (LWP 45359)]
        [New Thread 0x7fffbe7fc640 (LWP 45360)]
        [New Thread 0x7fffbdffb640 (LWP 45361)]
        [New Thread 0x7fffbd7fa640 (LWP 45362)]
        getting LINES done
        alllines: []
        l []
        i 0
        0
Thread 1 "myprogram" received signal SIGSEGV, Segmentation fault. _D14analysisEngine9geoEngine20calculate_lineLengthMFiZd (this=<optimized out>, i=0) at source/analysisEngine.d:15526
        15526
        writeln("l0 ", l[0]);

So, to see what is going on, i use the command `bt`:


#0 _D14analysisEngine9geoEngine20calculate_lineLengthMFiZd (this=<optimized out>, i=0) at source/analysisEngine.d:15526 #1 0x00005555555dba40 in _D14analysisEngine9geoEngine13add_turnLinesMFZv (this=<optimized out>) at source/analysisEngine.d:7387 #2 0x00005555555e375a in _D14analysisEngine9geoEngine15analyze_tillageMFZv (this=0x7ffff756a000) at source/analysisEngine.d:5329 #3 0x000055555560d082 in _Dmain (args=...) at source/AI.d:123


Okey, I know where to look for : it's the line asking for `writeln("l0 ", l[0]);`.


But should it not be caught by range error ? If I do `print l`in gdb, i find :
        $1 = {length = 0, ptr = 0x0}

With `print l[0]` i get: `Attempt to take address of value not located in memory.`. I believe the array printing syntax is valid; see [here](https://phoenix.goucher.edu/~kelliher/cs23/gdb.html).

What absolute rookie mistake am I committing? What does it mean : "Attempt to take address of value not located in memory" ? I am not even calling / accessing a pointer. I am trying to extract a value outside an array bound.

I imagine they all have their addresses. But with the bound checking operation in place, would the bound error be triggered before the attempt to take unavailable address error has a chance to trigger?

Thank you.


Reply via email to