Deutsch
Germany.ruФорумы → Архив Досок→ Программирование

как победить sprintf ?

26.05.17 19:49
Re: как победить sprintf ?
 
anly коренной житель
anly
в ответ BorisL0 26.05.17 18:49, Последний раз изменено 26.05.17 20:08 (anly)

да нет, как раз недостаток функций с тремя точками именно есть - отсутствие контроля типа. Т.е. туда передать можно всё что угодно.

поэтому

sprintf(buf, "%s", std::string());

прекрасно компилируется, но приводит к вылету при выполнении.


Кстати в некоторых случаях подобный код работает без вылета. А точнее такой:

sprintf(buf, "%s", CString());

и работает он только потому что внутри себя CString самыми первыми данными (а в релизе других и нет) располагает сам указатель на стринг. Ну и еще одно условие успешной работы - этот CString должен быть последним в списке, ибо после него имплементации sprintf-а уже невозможно вычислить адрес следующего параметра (ведь %s для sprintf-а означает что следующий будет через 4 байта, а не через sizeof(CString), о размере которого он понятия не имеет).


Самое правильное, заменить все переменные std::string s в sprintf на s.c_str()

это верно, но в достаточно большом проекте это нереально. А вот с описанным выше способом - реально, причем сам компилятор покажет где это нужно подправить.


Кстати для чистоты описанный выше способ можно заключить в #ifdef _DEBUG. Хотя по идее в релизе компайлер и сам оптимизирует инлайн функции, а пустые как check_t вообще выбросит.

Проклят нарушающий межи ближнего своего (Втор.27:17)
 

Перейти на