Bad array indexing is considered deadly

Moritz Maxeiner via Digitalmars-d digitalmars-d at puremagic.com
Wed May 31 14:43:58 PDT 2017


On Wednesday, 31 May 2017 at 21:00:43 UTC, Steven Schveighoffer 
wrote:
> On 5/31/17 3:17 PM, Moritz Maxeiner wrote:
>> On Wednesday, 31 May 2017 at 13:04:52 UTC, Steven 
>> Schveighoffer wrote:
>>> [...]
>>>
>>> What are your thoughts? Have you run into this? If so, how 
>>> did you
>>> solve it?
>>>
>>
>> It is not that accessing the array out of bounds *leading* to 
>> data
>> corruption that is the issue here, but that in general you 
>> have to
>> assume that the index *being* out of bounds is itself the 
>> *result* of
>> *already occurred* data corruption;
>
> To be blunt, no this is completely wrong.

I disagree.

> Memory corruption *already having happened* can cause any 
> number of errors.

Correct, of which out of bounds array is *one*.

> The point of bounds checking is to prevent memory corruption in 
> the first place.

That is *one* of the purposes. The other is to abort in case of 
already occurred memory corruption.

> I could memory corrupt the length of the array also (assuming a 
> dynamic array), and bounds checking merrily does nothing to 
> stop further memory corruption.

Yes, that is one case against out of bounds checks do not help; 
but that changes nothing for the case we were talking about.

>
> The runtime should not assume that crashing the whole program 
> is necessary when an integer is out of range.

Without *any* other information, I think it should.

> Preventing actual corruption, yes that is good. But an 
> Exception would have done the job just fine.

If it were only about further memory corruption, yes, but as I 
said, my argument about preexisting corruption remains.

>
> But that ship, as I said elsewhere, has sailed. We can't change 
> it to Exception now, as that would break just about all nothrow 
> code in existence.

Sure.

>
>> So in your specific use case I would say use a wrapper. This 
>> is one of
>> the reasons why I am working on my own library for data 
>> structures (libds).
>
> That is my conclusion too. Is your library in a usable state?

Well, since I really needed only a single data structure at the 
time, it only contains a binary heap so far, but I believe it to 
be usable. I intend to add a dynamic array implementation next.

> Perhaps we should not repeat efforts, though I wasn't planning 
> on making a robust public library for it :)

Well, you can take a look at the binary heap implementation[1] 
and decide if that a style you are interested in, but it does 
currently use errors for things such as removing an element when 
the heap is empty; I am not sure there, what I intend to do here, 
but I might make it configurable via the Conf template parameter 
in a design-by-introspection style.

[1] https://github.com/Calrama/libds



More information about the Digitalmars-d mailing list