Код MSVC / Linux для count_sprintf - PullRequest
       6

Код MSVC / Linux для count_sprintf

0 голосов
/ 03 марта 2011

Мне нужна функция count_sprintf (), которая должна возвращать
количество символов (не включая ноль байт), необходимое для форматированного буфера, в Win32 и в Linux.

int count_sprintf(const char *format, va_list ap);

Существуют тонкие различия между двумяWin32 против Linux в возвращаемом значении vsnprintf, когда форматированное значение длиннее размера буфера.Вот почему я прошу о помощи.

Можете ли вы дать переносимый код (#ifdef WIN32) для этой функции.

Функция, которая будет использоваться следующим образом:

int bufsize = 1 + count_snprintf(format, ap);  
char *buf = (char*)malloc(bufsize);  
vsnprintf(buf, bufsize, format, ap); // on WIN32, _vsnprint, on Linux, vsnprintf.

Спасибо

Ответы [ 4 ]

3 голосов
/ 03 марта 2011

Во время выполнения VS есть _vscprintf, который считает необходимые символы.

int count_sprintf(const char *format, va_list ap) {
#ifdef WIN32
  return _vscprintf(format, ap);
#else
  char c;
  return vsnprintf(&c, 1, format, ap);
#endif
}
1 голос
/ 03 марта 2011

Я не могу сказать, хотите ли вы решение C, C ++ или и то и другое.

В C ++ существует чрезвычайно простой способ решить эту проблему: использовать потоки вместо строки функций printf.

В CI настоятельно рекомендуется позаботиться о любых случаях, когда вы используете строку переменного формата: они могут вызвать проблемы, если переменные функции хоть немного отключены, и нет никакого способа дляКомпилятор, чтобы помочь вам.Если формат генерируется внешне, это хуже, так как вы в основном открыты для любого количества эксплойтов переполнения буфера.По крайней мере, если у вас есть строка фиксированного формата, вы знаете, как долго она будет начинаться, и некоторые компиляторы могут выполнять проверку строки формата для varargs.

0 голосов
/ 03 марта 2011

Вы можете использовать vsnprintf для этого - если вы дадите ему буфер размера 0, он на самом деле не будет пытаться что-то поместить в буфер, но все равно вернет количество символов, которое он вывел бы

0 голосов
/ 03 марта 2011

В Linux вы можете использовать asprintf:

   The  functions asprintf() and vasprintf() are analogs of sprintf(3) and
   vsprintf(3), except that they allocate a string large  enough  to  hold
   the output including the terminating null byte, and return a pointer to
   it via the first argument.  This pointer should be passed to free(3) to
   release the allocated storage when it is no longer needed.
...