Why do private member variables behaved like protected in the same module when creating deriving class?
Patrick Schluter
Patrick.Schluter at bbox.fr
Thu Nov 1 21:03:28 UTC 2018
On Thursday, 1 November 2018 at 20:15:57 UTC, Paul Backus wrote:
> On Thursday, 1 November 2018 at 19:26:05 UTC, Steven
> Schveighoffer wrote:
>>
>> My testing looks like it's the same:
>>
>> #include <stdio.h>
>> int main()
>> {
>> int arr[5];
>> int *ptr = arr + 1; // point at second element so we can
>> do negative indexing legally
>> int idx1 = 0;
>> ptr[--idx1] = 5;
>> printf("%d\n", arr[0]); // 5
>> size_t idx2 = 0;
>> ptr[--idx2] = 6;
>> printf("%d\n", arr[0]); // 6
>> return 0;
>> }
>>
>> -Steve
>
> `ptr[--idx2]` is undefined behavior (out-of-bounds array
> access), so the fact that it works that way is just a
> coincidence.
It works also because the optimizer eludes the ptr accesses. So
to test the example, at least put -O0.
mov esi, 5
mov edi, OFFSET FLAT:.LC0
xor eax, eax
call printf
mov esi, 6
mov edi, OFFSET FLAT:.LC0
xor eax, eax
call printf
and in real life, the erroneaous accesses where I had the index
underflowing the array were much more complicated and have not
been found for decades. We had noticed sometimes that things were
wrong in the documents processed, but it was impossible to trace
back were the error was. After refactoring to use more
agressively size_t a whole bunch of these glitchy glitches
transformed into nice actionable debugable core dumps.
More information about the Digitalmars-d
mailing list