As R's sprintf is a wrapper for the OS's sprintf, misuse does run the risk of crashing from OS, and when it does the error will come from the implementation of sprintf (which for R for Windows is the Trio library). One could argue that the OS service should not segfault on incorrect input, but this one often does.

The place to add checks is in the R wrapper code (presumably in the C component). We do have checks there, but it is hard to imagine just what errors users will make, and this one has slipped through the checks.

Here the issue is the use of %S, an unknown format for numbers, followed by 'X'. There is a check for a suitable format, but it is not strict enough. And it is non-trivial to write a printf format parser just to check for user error (and potentially it will slow down correct uses: speed in sprintf is important in some applications).

So I am not sure this is something that should be R's responsibility to fix: maybe just add a warning to the help page?


On Thu, 13 Nov 2008, Duncan Murdoch wrote:

On 12/11/2008 8:30 PM, [EMAIL PROTECTED] wrote:
Full_Name: Oren Cheyette
Version: 2.7.2
OS: Win XP
Submission from: (NULL) (64.161.123.194)


Enter the following at the R command prompt:
sprintf("A %S %S %S XYZ", 1, 1, 1);

R is not C, and the empty command at the end of that line (after the semicolon) is not relevant.

Note the erroneous capitalized %S instead of %s and the numeric inputs instead
of strings. With strings there's no crash - R reports bad format
specifications.

2.7.2 is obsolete, but I can confirm a crash on Windows with a recent R-devel.

The last few entries in the stack dump at the time of the crash are shown below; these make it look as though the problem is in the Trio library, so it may be hard to fix.

Duncan Murdoch


Rgui.exe caused an Access Violation at location 6c913fb3 in module R.dll Reading from location 00000001.

Registers:
eax=7fffffff ebx=00000000 ecx=00e17b21 edx=00000001 esi=00e1c83b edi=0000000a
eip=6c913fb3 esp=00e17944 ebp=00e17b3c iopl=0         nv up ei pl nz na po nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000 efl=00000206

Call stack:
6C913FB3  R.dll:6C913FB3  TrioFormatProcess  trio.c:2724

        ...
          while (length > 0)
            {
size = TrioWriteWideStringCharacter(self, *wstring++, flags,
length);
              if (size == 0)
        break; /* while */
        ...

6C916592  R.dll:6C916592  trio_vsprintf  trio.c:3771

        ...
            return status;

          status = TrioFormatProcess(&data, format, parameters);
          if (data.error != 0)
            {
        ...

6C911F62  R.dll:6C911F62  sprintf  compat.c:46

        ...
            va_end(ap);
            return res;
        }


        ...

6C889F1E  R.dll:6C889F1E  do_sprintf  sprintf.c:297

        ...
            sprintf(bit, fmtp, " NaN");
        else
            sprintf(bit, fmtp, "NaN");
            } else if (x == R_PosInf) {
        if (strcspn(fmtp, "+") < strlen(fmtp))
        ...

______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel


--
Brian D. Ripley,                  [EMAIL PROTECTED]
Professor of Applied Statistics,  http://www.stats.ox.ac.uk/~ripley/
University of Oxford,             Tel:  +44 1865 272861 (self)
1 South Parks Road,                     +44 1865 272866 (PA)
Oxford OX1 3TG, UK                Fax:  +44 1865 272595

______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel

Reply via email to