powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Ошибка в сообщении об ошибке (или как перехватить вылет vsprintf())
18 сообщений из 18, страница 1 из 1
Ошибка в сообщении об ошибке (или как перехватить вылет vsprintf())
    #38787291
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть такой код
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
#include <stdio.h>
#include <stdarg.h>
#include <stdlib.h>

void to_log(const char* msg, ...)
{
	char buf[1024];
	va_list ap;
	va_start(ap, msg);
	vsprintf(buf, msg, ap); // тут вылетает
	va_end(ap);
	printf("%s\n", buf);
}

int main(int argc, char* argv[])
{
	int i = 1;
	to_log("error %s", i);
	return 0;
}



Пишу так в лог ошибку, т.к. ошибки не всегда, то некоторые записи оказываются непроверенные и вместо записи в лог получаю вылет проги. Как правильно проверить и предотвратить вылет? try ... catch не помогло.
...
Рейтинг: 0 / 0
Ошибка в сообщении об ошибке (или как перехватить вылет vsprintf())
    #38787296
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TЕсть такой код

Пишу так в лог ошибку, т.к. ошибки не всегда, то некоторые записи оказываются непроверенные и вместо записи в лог получаю вылет проги. Как правильно проверить и предотвратить вылет?


Никак. Это защита памяти.

Dima T try ... catch не помогло.

и не поможет. Это защита памяти, это не исключение.


должно быть
Код: plaintext
1.
2.
3.
4.
5.
6.
int main(int argc, char* argv[])
{
	int i = 1;
	to_log("error %d", i);
	return 0;
}
...
Рейтинг: 0 / 0
Ошибка в сообщении об ошибке (или как перехватить вылет vsprintf())
    #38787297
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivдолжно быть
Я понимаю что так должно быть по другому, но хочу увидеть в логе что-то типа 'Кривой шабон "error %s"' но не вылет.
MasterZivНикак. Это защита памяти.
Хорошо, в виндовсе SEH поможет (__try ... ), а как это перехватить в линуксе ? Мне универсально надо.
...
Рейтинг: 0 / 0
Ошибка в сообщении об ошибке (или как перехватить вылет vsprintf())
    #38787302
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я понимаю что так должно быть по другому, но хочу увидеть в логе что-то типа 'Кривой шабон "error %s"' но не вылет.


Не увидишь. Никогда. Это -- С-шный код, а не С++, там нет исключений.
GPF -- и с копыт...


MasterZivНикак. Это защита памяти.
Хорошо, в виндовсе SEH поможет (__try ... ), а как это перехватить в линуксе ? Мне универсально надо.[/quot]

Никак.
Нет SEH в Linux.


Если очень хочется, используй какой-нибудь С++ аналог vsprintf из BOOST-а.
...
Рейтинг: 0 / 0
Ошибка в сообщении об ошибке (или как перехватить вылет vsprintf())
    #38787332
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,

Вылетает-то из-за чего?
Если переполнение буфера, то ограничить запись в буфер через vs n printf.
Это впрочем по-любому надо сделать.
...
Рейтинг: 0 / 0
Ошибка в сообщении об ошибке (или как перехватить вылет vsprintf())
    #38787333
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyВылетает-то из-за чего?
А, почитал внимательнее. Снимаю вопрос.

Избежать такого крэша никак нельзя, не устранив "..." .
Только через строго типизированные параметры.
...
Рейтинг: 0 / 0
Ошибка в сообщении об ошибке (или как перехватить вылет vsprintf())
    #38787335
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TХорошо, в виндовсе SEH поможет (__try ... ), а как это перехватить в линуксе ? Мне универсально надо.
MasterZivНикак.
Нет SEH в Linux.

Временно перехватить SIGSEGV.
Но суть в том что это не устранит мусор в логах.
...
Рейтинг: 0 / 0
Ошибка в сообщении об ошибке (или как перехватить вылет vsprintf())
    #38787420
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyDima TХорошо, в виндовсе SEH поможет (__try ... ), а как это перехватить в линуксе ? Мне универсально надо.
MasterZivНикак.
Нет SEH в Linux.

Временно перехватить SIGSEGV.
Но суть в том что это не устранит мусор в логах.

Да важнее не мусор в логах, а повреждение стека в потоке, и, как следствие, крах потока , а если он главный -- то всего приложения.
...
Рейтинг: 0 / 0
Ошибка в сообщении об ошибке (или как перехватить вылет vsprintf())
    #38787430
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv,

Как избежать повреждения памяти я выше написал - vsnprintf.
Перехват SIGSEGV нужен для обработки чтения несуществующей памяти из-за мусора в указателе.
...
Рейтинг: 0 / 0
Ошибка в сообщении об ошибке (или как перехватить вылет vsprintf())
    #38787432
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TКак правильно проверить и предотвратить вылет?
Использовать на процедуру to_log атрибут format в сочетании с -Eformat. И тогда твоя
программа просто не откомпилируется.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Ошибка в сообщении об ошибке (или как перехватить вылет vsprintf())
    #38787467
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyMasterZiv,

Как избежать повреждения памяти я выше написал - vsnprintf.
Перехват SIGSEGV нужен для обработки чтения несуществующей памяти из-за мусора в указателе.


ок, а как ты стек будешь восстанавливать?
конечно, в которых calling convention он восстанавливается автоматом ...
...
Рейтинг: 0 / 0
Ошибка в сообщении об ошибке (или как перехватить вылет vsprintf())
    #38787542
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Заменил на vsnprintf, но мою проблему это не решает.
Dimitry SibiryakovИспользовать на процедуру to_log атрибут format в сочетании с -Eformat. И тогда твоя
программа просто не откомпилируется.

Спасибо, так еще лучше.
написал так
Код: plaintext
1.
void __attribute__ ((format (printf, 1, 2))) to_log(const char* msg, ...)


только ключ -Wformat (-Eformat не понимает)
Код: plaintext
1.
g++ -Wformat 1.cpp


Компилируется, но варнинги пишет.
...
Рейтинг: 0 / 0
Ошибка в сообщении об ошибке (или как перехватить вылет vsprintf())
    #38787554
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TКомпилируется, но варнинги пишет.
Добавь -Werror и это будут ошибки.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Ошибка в сообщении об ошибке (или как перехватить вылет vsprintf())
    #38787577
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivок, а как ты стек будешь восстанавливать?
конечно, в которых calling convention он восстанавливается автоматом ...
Я не понял зачем надо восстаналивать стек.
Там проблема не в этом.
Даже если проигнорить ошибку доступа, то выполнение printf продолжится имея мусор в регистрах.
Не зря в стандарте чтение по 0 или неинициализированному указателю - UB

Впрочем что тут обсуждать - нормальное решение уже найдено :)
...
Рейтинг: 0 / 0
Ошибка в сообщении об ошибке (или как перехватить вылет vsprintf())
    #38787647
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky,
стек может быть разрушена потому что пихнули туда одно количество байт, а впихнут другое.
...
Рейтинг: 0 / 0
Ошибка в сообщении об ошибке (или как перехватить вылет vsprintf())
    #38787672
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivстек может быть разрушена потому что пихнули туда одно количество байт, а
впихнут другое.
Не может. Стэк у cdecl чистит вызывающая сторона, так что сколько она туда впихнула,
столько и выпихнет.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Ошибка в сообщении об ошибке (или как перехватить вылет vsprintf())
    #38787753
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

соглашения о вызовах бывают разные...
...
Рейтинг: 0 / 0
Ошибка в сообщении об ошибке (или как перехватить вылет vsprintf())
    #38787757
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivсоглашения о вызовах бывают разные...
Но только одно допускает использование многоточия.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Ошибка в сообщении об ошибке (или как перехватить вылет vsprintf())
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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