2

OSX での vsprintf の奇妙な動作を発見しました。

これは私のコードです:

#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <string.h>
#if defined(WIN32)
#include <windows.h>
#define VSNPRINTF _vsnprintf
#elif defined(LINUX) || defined (DARWIN)
#define VSNPRINTF vsnprintf
#include <sys/types.h>
#include <unistd.h>
#endif

char *f(const char *fmt, ...)
{
 char *out = NULL;
 const int step = 32;
 int n = -1, lout = step;
 va_list arg;

 if(fmt!=NULL)
 {
  va_start(arg, fmt);
  do
  {
   if(!out)
   {
    free(out);
    out = NULL;
   }
   out = (char*)malloc(lout + 1);
   if(!out) break;
   memset(out, 0, lout + 1);   

   n = VSNPRINTF(out, lout, fmt, arg);
   if(n == -1 || n + 1 > lout)
   {
    lout += step;
    n = -1;
   }
  }while(n == -1);
  va_end(arg);
 }

 return out;
}

int main()
{
 char *msg = NULL;
 unsigned long x = 0xDEADBEEF;

 msg = f("%X%X%X%X", x, x, x, x);
 if(!msg) return -1;

 puts(msg);

 return 0;
}

この関数は、書式設定されたテキストを含む割り当てられた文字列 (char*) を返します。Linux と Windows で正しく動作します。OSX では不適切な形式のテキストが返され、場合によってはセグメンテーション違反 (EXC_BAD_ACCESS) が発生します。ところで、私は vasprintf を使用できることを知っています。

何が問題になる可能性がありますか?

4

1 に答える 1