Bugtraq mailing list archives

Re: i18n issues with format bugs


From: "Forrest J. Cavalier III" <mibsoft () epix net>
Date: Wed, 26 Jul 2000 16:35:14 -0400

Anyone who looked at the I18N problem for more than a minute realizes
that printf-style messages with inlined parameters is a big mess:
There is no clean solution for reordering parameters to fit the
phrase ordering of every human language.

The security implications raised in this thread just add to the
problems.

To eliminate both problems, and get some other benefits, consider
showing parameters separate from the explanation text.

Instead of:

        f = fopen(argv[1],"r");
        if (!f) {
            fprintf(stderr,_("Could not open file %s:%s\n"),
                    argv[1],strerror(errno));
            exit(1);
        }

write it as:
        f = fopen(argv[1],"r");
        if (!f) {
            fprintf(stderr,"%s ",   _("Could not open file."));
            fprintf(stderr,"{%s} ", argv[1]));
            fprintf(stderr,"{%s}\n",strerror(errno));
            exit(1);
        }

Benefits:
   - GCC (or other) can verify that the format-string matches
     the arguments used: it is a constant format string.

     Alternatively, do away with the printf-style function,
     since every call here has exactly 3 arguments.  A wrapper
     function could be written for each parameter type, and that
     will work with any ANSI compiler.  A macro could be used
     to hide some of the details.
          #define ERR_PARMS(s)  (fprintf(stderr," {%s}",(s)))

   - Eases I18N (for the documentation too!)  There is a
     constant text string to translate, not one with embedded
     parameter formatting.

   - The output is easier to process (for humans and machines.)

     For example, it is easier to wrap by TCL, or make a
     post-processor for log files, without resorting to
     advanced regular expressions, or breaking after I18N

Downsides:
   - verbose (although the macro idea helps a lot.)

Forrest J. Cavalier III, Mib Software
   More than 10,000 links to code and the knowledge to use it.
   http://www.rocketaware.com/  Programmer's Webliography


Current thread: