[Issue 4458] New: Static typing for format strings, when possible

d-bugmail at puremagic.com d-bugmail at puremagic.com
Wed Jul 14 04:38:17 PDT 2010


http://d.puremagic.com/issues/show_bug.cgi?id=4458

           Summary: Static typing for format strings, when possible
           Product: D
           Version: D2
          Platform: All
        OS/Version: All
            Status: NEW
          Keywords: diagnostic
          Severity: enhancement
          Priority: P2
         Component: DMD
        AssignedTo: nobody at puremagic.com
        ReportedBy: bearophile_hugs at eml.cc


--- Comment #0 from bearophile_hugs at eml.cc 2010-07-14 04:38:11 PDT ---
In some situations the format string of writef/writefln is not known at
compile-time, but it most situations it is. So in the frequent cases where the
format string is known at compile-time I'd like an error at compile-time if the
type in the format string and the type of the arguments don't match. 

An error at compile-time is better, it gives the same advantages of static
typing, and it allows the programmer to catch format string bugs before
runtime, in all the program, even in parts of the code that aren't run yet (a
runtime bugs happens only with a specific writefln comes into the thread of
code being run).

Currently (dmd v2.047) this compiles with no errors:


import std.stdio: writefln;
void main() {
    float f = 10.5;
    writefln("%d", f);
}


But I'd like an error similar to:

test.d(4): Error: writefln format string type error, used format '%d' but
argument 'f' is of type float

Once written, this new testing routine can be useful for other functions too,
for the format(), some I/O functions, and for C functions like printf() too
that sometimes are present in D programs.


This is a similar C program:

#include "stdio.h"
int main() {
    float f = 10.5;
    printf("%d\n", f);
    return 0;
}



If compiled with GCC 4.5:
gcc -Wall testc.c -o testc

It outputs at compile-time:
test.c: In function 'main':
test.c:4:5: warning: format '%d' expects type 'int', but argument 2 has type
'double'


GCC 4.5 is not able to spot the bug in this program:

#include "stdio.h"
int main() {
    float f = 10.5;
    const char* format = "%d\n";
    printf(format, f);
    return 0;
}

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------


More information about the Digitalmars-d-bugs mailing list