digitalmars.D.bugs - [Issue 11240] New: assumeSafeAppend could implicitly break immutablity
- d-bugmail puremagic.com (31/31) Oct 12 2013 http://d.puremagic.com/issues/show_bug.cgi?id=11240
- d-bugmail puremagic.com (19/19) Oct 13 2013 http://d.puremagic.com/issues/show_bug.cgi?id=11240
- d-bugmail puremagic.com (15/30) Oct 13 2013 http://d.puremagic.com/issues/show_bug.cgi?id=11240
- d-bugmail puremagic.com (21/21) Oct 13 2013 http://d.puremagic.com/issues/show_bug.cgi?id=11240
- d-bugmail puremagic.com (12/12) Oct 13 2013 http://d.puremagic.com/issues/show_bug.cgi?id=11240
http://d.puremagic.com/issues/show_bug.cgi?id=11240
Summary: assumeSafeAppend could implicitly break immutablity
Product: D
Version: D2
Platform: All
OS/Version: All
Status: NEW
Severity: major
Priority: P2
Component: druntime
AssignedTo: nobody puremagic.com
ReportedBy: k.hara.pg gmail.com
I think assumeSafeAppend should reject array references which has non-mutable
element type.
Test case:
import std.stdio;
void main()
{
immutable(int[]) arr = [1,2,3];
immutable(int)[] a = arr[0..2];
writeln("a.capacity = ", a.capacity); // == 0
a = assumeSafeAppend(a[]);
writeln("a.capacity = ", a.capacity); // != 0
a ~= 100;
writeln(a); // [1, 2, 100]
writeln(arr); // [1, 2, 100] <-- !!
}
--
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Oct 12 2013
http://d.puremagic.com/issues/show_bug.cgi?id=11240
monarchdodra gmail.com changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |monarchdodra gmail.com
Is this valid though?
assumeSafeAppend is an unsafe function that *requires* no one else have a view
on the items after the end of the array.
Just the same, you will overwrite the old items, without destroying them, nor
assigning over them.
I think this is just an unsafe function that was used wrong. The result is
simply undefined behavior.
I think it would be a needless restriction to not allow assumeSafeAppend on
immutable (and const).
This seems invalid to me.
--
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Oct 13 2013
http://d.puremagic.com/issues/show_bug.cgi?id=11240Is this valid though? assumeSafeAppend is an unsafe function that *requires* no one else have a view on the items after the end of the array. Just the same, you will overwrite the old items, without destroying them, nor assigning over them. I think this is just an unsafe function that was used wrong. The result is simply undefined behavior. I think it would be a needless restriction to not allow assumeSafeAppend on immutable (and const). This seems invalid to me.Because the unsafe-ness is hidden in assumeSafeAppend function template. If you pass immubtale(int)[] array reference to it in generic code, it could easily break type-system silently (And yes, I didn't noticed the risk until now). As the API design, it would be better to reject such a misuse. In other words, if you really wants to charge the capacity of immutable(int)[], enforcing explicit cast on caller side would be better. immutable(int)[] a = ...; //a = assubeSafeAppend(a); // compile error a = cast(typeof(a))aassubeSafeAppend(cast(int[])a); // ugly, but explicit -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Oct 13 2013
http://d.puremagic.com/issues/show_bug.cgi?id=11240
Jonathan M Davis <jmdavisProg gmx.com> changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |jmdavisProg gmx.com
PDT ---
I concur with monarchdodra. I think that this would be too strong a
restriction. assumeSafeAppend is already system. You're already not supposed
to be calling it on an array that isn't actually safe to append to. The
constness of the array doesn't change that. Maybe more explicit warnings should
be put in the documentation for assumeSafeAppend, but the documentation is
already pretty clear that you shouldn't use it if it's not actually safe to
append.
I think that if assumeSafeAppend is misused, it's clearly a bug on the part of
the caller and not assumeSafeAppend, even if that bug involves const or
immutable. And given that the most likely type to use with assumeSafeAppend is
probably string, restricting it to only work with mutable elements would be
really reduce its usefulness.
--
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Oct 13 2013
http://d.puremagic.com/issues/show_bug.cgi?id=11240 PDT --- I think that making it so that assumeSafeAppend didn't work with const or immutable would be akin to making free not work with const or immutable. Both function are inherently unsafe and must be used correctly and could cause serious issues if misused, and both are related to indicating which memory can be used. But both are also just fine if used correctly. The key thing is in making sure that it's clear in the documentation how the function is intented to be used and that using it differently is unsafe. -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Oct 13 2013









d-bugmail puremagic.com 