If you pass a static char array to toStringz, the post-condition
assert(strlen(result) == string.length);
maybe violated:
DMD doesn't have this AssertError.
------------------------------------
$ cat strz.d
import std.string;
int main()
{
char[4] buf;
buf[2] = '\000';
toStringz(buf);
return 0;
}
$ gdmd strz.d
$ ./strz
Error: AssertError Failure std/string.d(230)
$ gdmd
gdc (GCC) 3.3.6 (gdc 0.14, using dmd 0.127)
Copyright (C) 2003 Free Software Foundation, Inc.
↑ ↓ ← → =?ISO-8859-1?Q?Anders_F_Bj=F6rklund?= <afb algonet.se>
writes:
d d.com wrote:
DMD doesn't have this AssertError.
That is just because DMD doesn't have *any*
contracts enabled in the Phobos library...
import std.string;
int main()
{
char[4] buf;
buf[2] = '\000';
toStringz(buf);
return 0;
}
The contract of toStringz says: no NUL chars,
so that is why it is complaining about this.
You can compile libgphobos.a with -release,
if you want to avoid the asserts/contracts ?
(just like you can recompile libphobos.a
without -release, if you do want them ?)
Not a bug.
--anders
DMD doesn't have this AssertError.
import std.string;
int main()
{
char[4] buf;
buf[2] = '\000';
toStringz(buf);
return 0;
}
That is just because DMD doesn't have *any*
contracts enabled in the Phobos library...
Good to know that. (Cross-post to digitalmars.D.bugs)
The contract of toStringz says: no NUL chars,
Not a bug.
Where the contract is said? If in the pre-condition, then I agree.
Now it fails in the post-condition, definately a bug.
This is a reason I love DbC: everything has to be explicit.
You can compile libgphobos.a with -release,
if you want to avoid the asserts/contracts ?
(just like you can recompile libphobos.a
without -release, if you do want them ?)
I think the default installation should install 2 versions of libphobos.a:
-- one optimized version with -release, so all the checking is turned-off for
maximal speed.
-- one debug version with checking turned-on.
I just noticed my programm runs so slow with GDD. After adding -profile option,
I found out that 99% (the top 7 entry) of the time is spent on checking (the top
2 takes 98.61% time on invariant):
-------------------------------------------------------------------------
Each sample counts as 0.01 seconds.
% cumulative self self total
time seconds seconds calls s/call s/call name
75.52 3026.31 3026.31 _D3gcx4Pool11__invariantFZv
23.09 3951.46 925.15 _D3gcx3Gcx11__invariantFZv
0.32 3964.15 12.69
_D9invariant12_d_invariantFC6ObjectZv
0.18 3971.50 7.35 _D3gcx4Pool9InvariantFZv
0.18 3978.81 7.31 _D3gcx3Gcx11fullcollectFPvZk
0.12 3983.57 4.76
_D3gcx4Pool5opCmpFPS3gcx4PoolZi
0.09 3987.20 3.63 _D3gcx3Gcx4markFPvPvZv
..
..
-------------------------------------------------------------------------
This is crazy!
By any means, please provide two versions of libphobos.a in the default
installation! If only one is provided, please install the ***optimized***
version!!! (How many ordinary D programmer would care about the contract inside
libphobos.a? how would you expect them to do with it when the contract fails
inside libphobos.a?)
Otherwise, people will feel bad about D's performance claim! and nobody is going
to use it.
↑ ↓ ← → =?ISO-8859-1?Q?Anders_F_Bj=F6rklund?= <afb algonet.se>
writes:
d d.com wrote:
I think the default installation should install 2 versions of libphobos.a:
-- one optimized version with -release, so all the checking is turned-off for
maximal speed.
-- one debug version with checking turned-on.
I just noticed my programm runs so slow with GDD. After adding -profile
option,
I found out that 99% (the top 7 entry) of the time is spent on checking (the
top
2 takes 98.61% time on invariant):
Strange, I'm pretty sure that it used to build Phobos with -frelease ?
Something must have changed there in the last couple of GDC versions...
And I agreee, the default libgphobos.a (notice: "G") lib should be
built without the contracts - perhaps another version with them on.
--anders
↑ ↓
← → =?ISO-8859-1?Q?Anders_F_Bj=F6rklund?= <afb algonet.se>
writes:
d d.com wrote:
$ gdmd
gdc (GCC) 3.3.6 (gdc 0.14, using dmd 0.127)
Copyright (C) 2003 Free Software Foundation, Inc.
Hmm, wonder why my Mac OS X build doesn't say that ?
# gdmd
gdc (GCC) 3.3.6
Copyright (C) 2003 Free Software Foundation, Inc.
Do I have to add something to the build or platform ?
OK, found it - it had been "sneaked" into the setup-gcc.sh...
Using a special setup to build the Mac OS X version (gdcmac)
and do the extra patches and the installer packaging etc. etc.
I'll add it to the gdc 0.15 build, or something like that. :-)
--anders