array.reverse segfaults
Denis Koroskin
2korden at gmail.com
Wed Oct 22 06:46:26 PDT 2008
On Wed, 22 Oct 2008 15:21:03 +0400, Moritz Warning <moritzwarning at web.de>
wrote:
> On Wed, 22 Oct 2008 13:10:20 +0200, Tomas Lindquist Olsen wrote:
>
>> Tomas Lindquist Olsen wrote:
>>> Moritz Warning wrote:
>>>> Hi,
>>>>
>>>> This piece of code segfaults on Debian Linux (with dmd 1.035): Can
>>>> someone tell me why?
>>>>
>>>> char[] get(char[] str)
>>>> {
>>>> return new char[](4);
>>>> }
>>>>
>>>> void main(char[][] args)
>>>> {
>>>> char[] str = get("abc");
>>>> char[] reversed = str.reverse; // <-- access violation
>>>> }
>>>
>>> Simpler version:
>>>
>>> void main()
>>> {
>>> char[4] str;
>>> str.reverse;
>>> }
>>>
>>> Crashes in _adReverseChar when trying to memmove (3 - 255) bytes ;)
>>>
>>> My best guess is that is just doesn't handle char.init values properly!
>>
>> When it tries to get the lower stride, it gets 0xFF from the table, but
>> it doesn't check if this value is usable.
>>
>> Probably just ignoring these invalid bytes would make it work. But I
>> think the real question is, what should _adReverseChar really do on
>> invalid UTF-8 input?
>
> I think it should do the same as on an invalid pointer: result in
> undefined behavior (=> segfault).
It should not pass the assert(isValidUtf8String(str)) prior to in-place
reverse, thus throwing an exception in debug mode.
Release behaviour is a subject to debat, but I think it should be more
robust. Given wrong input it may produce whatever wrong output, but
segfault? That's too bold.
More information about the Digitalmars-d
mailing list