Как предотвратить переполнение буфера указателя на символ? - PullRequest
4 голосов
/ 11 мая 2010

т.е. -

int function(char* txt)
{
   sprintf(txt, "select * from %s;", table);
   //How do I set last char in buffer to NULL here?
}

так что если текст в таблице как-то длился 500 символов, а txt в основном был определен как 100 ....

спасибо.

Ответы [ 3 ]

11 голосов
/ 11 мая 2010

Вам нужно

  • добавить параметр в функцию, которая дает размер буфера
  • используйте snprintf() вместо sprintf()
  • проверьте возвращаемое значение snprintf(), чтобы увидеть, насколько большим должен быть буфер для хранения всех отформатированных данных; если он больше или равен размеру буфера, вы должны обрабатывать его так, как считаете нужным (буфер по-прежнему будет иметь нулевое завершение, но содержимое будет усечено для соответствия; это нормально или ошибка зависит полностью на ваш случай использования)

(и вашей функции нужен тип возврата ...)

3 голосов
/ 11 мая 2010

Вы должны иметь возможность использовать snprintf для ограничения объема используемого буфера.

function(char* txt, size_t length)
{
   int rv;
   rv = snprintf(txt, length, "select * from %s;", table);
   //How do I set last char in buffer to NULL here?
   if (rv >= length) {
       // error
   }
}
0 голосов
/ 11 мая 2010

Единственное, что вы можете сделать, - это выделить достаточно памяти, отформатировать строку в эту память и вернуть указатель на нее. Вызывающая функция будет ответственна за освобождение памяти, когда закончите с ней.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...