Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / SegFault в vsnprintf / 5 сообщений из 5, страница 1 из 1
29.11.2016, 14:10
    #39356843
chikanok
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SegFault в vsnprintf
Добрый день.

Есть функция
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
void log1(const char *group, const char *msg, ...){
	va_list args;
	va_start(args, msg);
	size_t len = 100;
	std::unique_ptr<char> buf;
	do{
		buf.reset(new char[len]);
		auto r=vsnprintf(buf.get(), len, msg, args);
		if (r < 0) {
			log("LOG", "vsnprintf error");
			break;
		}
		if ((size_t)r < len){
			log(group, buf.get());
			break;
		}
		len *= 2;
	} while (true);	
	va_end(args);
}


Вызываю так:
Код: plaintext
1.
log1(G, "Call '%s'",str.c_str());


где str - std::string.
Если в результате будет строка больше 100 символов то приложение падает с SegFault со стеком:
Код: plaintext
1.
2.
3.
_IO_vfprintf_internal
___vsnprintf_chk
log1


Подскажите в чем проблема и как решить?
...
Рейтинг: 0 / 0
29.11.2016, 14:12
    #39356848
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SegFault в vsnprintf
chikanokПодскажите в чем проблема и как решить?
В том, что ты параметры только один раз инициализируешь.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
29.11.2016, 14:17
    #39356852
chikanok
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SegFault в vsnprintf
Dimitry SibiryakovchikanokПодскажите в чем проблема и как решить?
В том, что ты параметры только один раз инициализируешь.

Спасибо! Не углядел(((
...
Рейтинг: 0 / 0
29.11.2016, 21:25
    #39357310
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SegFault в vsnprintf
chikanok,

Вообще, это легче сделать через std::vector<char> вместо явного выделения памяти. Ну или string, но туда вроде бы писать нельзя ... не помню спеку.
...
Рейтинг: 0 / 0
30.11.2016, 03:41
    #39357372
Пётр Седов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SegFault в vsnprintf
chikanok
Код: plaintext
1.
2.
3.
	std::unique_ptr<char> buf;
	do{
		buf.reset(new char[len]);

std::unique_ptr<char>::reset делает «delete pointer», хотя здесь нужен «delete[] pointer». Можно использовать std::unique_ptr<char[]>, его reset делает «delete[] pointer».
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / SegFault в vsnprintf / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]