can we un-deprecate .ptr on arrays in @safe code? cf issue 18529

ag0aep6g anonymous at example.com
Tue Feb 27 18:26:18 UTC 2018


On 02/27/2018 06:32 PM, Atila Neves wrote:
> On Tuesday, 27 February 2018 at 12:39:04 UTC, Jonathan M Davis wrote:
[...]
>> In almost all cases, &a[0] is equivalent to a.ptr except that it does 
>> bounds checking, so it's actually @safe and thus doesn't need to be 
>> manually verified by the programmer, unlike your pointer function 
>> suggestion.
> 
> There's a common case where it's not equivalent - when the pointer is 
> null. Imagine I have a C function I want to call:
> 
> extern(C) void fun(int* things);
> 
> Imagine also that it's ok to call with null. Well, now I can't use a 
> slice to call this and have it be 1) @safe and 2) not throw RangeError. 
> I ran into this the other way.

As Jonathan says, you have to manually verify that it's safe, because it 
generally isn't. `arr.ptr` can be invalid but not null, even in @safe code.

Consider:

----
void fun(int* things) @safe
{
     int x = things is null ? 0 : *things;
     import std.stdio;
     writeln(x);
}

void main()
{
     int[] arr;
     fun(arr.ptr); /* Ok, prints "0". */

     arr = [1, 2, 3];
     fun(arr.ptr); /* Ok, prints "1".*/

     arr = arr[$ .. $]; /* This is @safe. */
     fun(arr.ptr); /* Not ok, prints garbage. */
}
----

The first two calls are actually safe and can be @trusted. The third 
call is invalid and must not be possible in @safe code.

Maybe it would be possible require `arr.ptr` to be valid or null in 
@safe code. This would outlaw `arr[$ .. $]` and bounds checking would 
have to catch it. I don't know if that would be any practical than 
banning `arr.ptr`.


More information about the Digitalmars-d mailing list