powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / SegFault в vsnprintf
5 сообщений из 5, страница 1 из 1
SegFault в vsnprintf
    #39356843
chikanok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день.

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

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

Вообще, это легче сделать через std::vector<char> вместо явного выделения памяти. Ну или string, но туда вроде бы писать нельзя ... не помню спеку.
...
Рейтинг: 0 / 0
SegFault в vsnprintf
    #39357372
Пётр Седов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
5 сообщений из 5, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / SegFault в vsnprintf
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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