Bug?

Jonathan M Davis via Digitalmars-d digitalmars-d at puremagic.com
Thu Jun 1 02:03:20 PDT 2017


On Thursday, June 01, 2017 08:45:56 Wulfklaue via Digitalmars-d wrote:
> Some C playing around:
> > import core.stdc.stdio;
> >
> > void main()
> > {
> >
> >     int x = 5;
> >     printf("The action is:\n%s", x);
> >
> > }
>
> There does not seem to be a type check on calling the C printf...
> %s expects a string but entering the wrong type like a integer
> simply dumps down to this.
>
> > The action is:
> > object.Error@(0): Access Violation

You're literally calling C's printf here, so you're going to get the same
behavior as printf, and there is no type checking. If you want type
checking, use writef or writefln.

> Playing around a bit more and even D can be made to crash:
> > import std.stdio : writefln;
> > void main()
> > {
> >
> >     int x = 5;
> >     writefln("The action is:\n%i", x);
> >
> > }
>
> > std.format.FormatException at C:\D\dmd2\windows\bin\..\..
\src\phobos\std\format.d(1744):
> Interesting ways to crash the code. I do not think this is
> expected behavior. :)
>
> And yes, i know that %i is not valid in this case but the fact
> that phobos simply crashes with a exception, no proper error
> warning ...
>
> If this error was somewhere in a large code base, it will be hard
> and time consuming to track down as the dumps do not show any
> trace / line error information.
>
> And side note: The first spot i look to report a bug, is on the
> DMD git repository ( and so do a lot of other people these days
> ). Do not even know where the bugs are reported here. Not very
> convenient.

The format string is a runtime argument. Why would you expect a compile-time
warning?

If you want it to be tested at compile time, then pass the string as a
compile-time argument. e.g.

writefln!"The action is:\n%i"(x);

and that will result in a static assertion failure.

- Jonathan M Davis



More information about the Digitalmars-d mailing list