[Issue 14127] New: @trusted functions in std.array present unsafe interfaces
via Digitalmars-d-bugs
digitalmars-d-bugs at puremagic.com
Thu Feb 5 02:00:01 PST 2015
https://issues.dlang.org/show_bug.cgi?id=14127
Issue ID: 14127
Summary: @trusted functions in std.array present unsafe
interfaces
Product: D
Version: D2
Hardware: All
OS: All
Status: NEW
Severity: normal
Priority: P1
Component: Phobos
Assignee: nobody at puremagic.com
Reporter: bugzilla at digitalmars.com
Functions marked as @trusted must present safe interfaces, or the code they are
used in cannot be trusted. std.array has several of these:
----
Line 100:
static auto trustedAllocateArray(size_t n) @trusted nothrow
{
return uninitializedArray!(Unqual!E[])(n);
}
returning uninitialized data is not safe.
----
Line 482:
auto uninitializedArray(T, I...)(I sizes) nothrow @trusted
returning uninitialized pointers is unsafe.
----
Line 868:
void trustedMemmove(void* d, const void* s, size_t len) @trusted
{
memmove(d, s, len);
}
declaring something as trusted doth not make it trustable.
----
Line 899:
static auto trustedAllocateArray(size_t n) @trusted nothrow
{
return uninitializedArray!(T[])(n);
}
again with the uninitialized data.
----
Line 1606, 1664, 1706:
static U trustedCast(U, V)(V v) @trusted { return cast(U) v; }
trivial wrappers around unsafe operations does not make them safe.
----
Line 2640:
()@trusted{ _data.arr = _data.arr[0 .. _data.capacity]; }();
trivial wrappers around unsafe operations does not make them safe.
----
Line 2656:
auto bi = ()@trusted{ return
GC.qalloc(newlen * T.sizeof, blockAttribute!T);
}();
trivial wrappers around unsafe operations does not make them safe.
----
Line 2668:
if (len)
()@trusted{ memcpy(bi.base, _data.arr.ptr, len * T.sizeof); }();
_data.arr = ()@trusted{ return (cast(Unqual!T*)bi.base)[0 .. len]; }();
trivial wrappers around unsafe operations does not make them safe.
----
Line 2723:
auto bigDataFun() @trusted nothrow { return _data.arr.ptr[0 .. len + 1];}
trivial wrappers around unsafe operations does not make them safe.
----
Line 2729:
auto ref uitem() @trusted nothrow @property { return cast(Unqual!T)item; }
trivial wrappers around unsafe operations does not make them safe.
----
Line 2773:
auto bigDataFun() @trusted nothrow { return _data.arr.ptr[0 .. newlen];}
trivial wrappers around unsafe operations does not make them safe.
----
Line 2839:
void clear() @safe pure nothrow
{
if (_data)
{
_data.arr = ()@trusted{ return _data.arr.ptr[0 .. 0]; }();
}
}
clear() is @trusted, it is not @safe.
----
Line 2857:
enforce(newlength <= _data.arr.length);
_data.arr = ()@trusted{ return _data.arr.ptr[0 .. newlength]; }();
The enforcement must go inside the @trusted code, not outside.
----
--
More information about the Digitalmars-d-bugs
mailing list