как победить sprintf ?
Пыхх... Я думал что ты понимаешь что предлагалось сделать...
Ладушки, опишу чуть подробнее.
В стек для спринтф() в любом случае ляжет указатель.
Либо на строку - тогда указатель на сегмент данных, либо на объект - тогда указатель на сегмент кода.
Соответственно, для ес-процент проверяешь куда указатель, объектный кастишь к типу объекта и вызываешь метод конверсии.
Метод вернет указатель на реальную строку и уже через этот указатель отдаешь ес-проценту.
Ну и не помешает в лог капнуть что такое имело место и где именнo...
В стек для спринтф() в любом случае ляжет указатель
ничего подобного! Ляжет то что было подставлено в аргументе. Может даже класс любого размера.
кастишь к типу объекта
тип узнать невозможно. я уже говорил: в стеке лежат какието числа, которые могут быть чем угодно: указателем, интом, доублом, или телом любого объекта любого типа, даже такого у которого никаких строк и в помине нет
Ляжет то что было подставлено в аргументе.
-----
Разумеется - именно то, что, по факту, прописано в параметрах.
Ожидаемое, однако, есть указатель на начало нуль-терминальной строки в сегменте данных.
в стеке лежат какието числа, которые могут быть чем угодно
-----
Ээээ... там лежат "числа", которые ты можешь интерпретировать как тебе нужно. Для спецификатора
'%s'
ты должен ожидать "указатель-на-строку" (в сегменте данных).
Если данные не соответствуют ожидаемым, т.е. имеется "указатель-в-другой-сегмент", то с его можно
интерпретировать как
void*
и кастить к нужному типу. Ну или смотреть что по факту компилятор туда складывает.
То. что у тебя может быть набор параметров никак не соответствующий заданному формату - это понятно, но в Сях с эллипсисом оно таково изначально и не решаемо средствами Сей.
Рекомендация относится к случаю когда параметр на месте, но не соответствует нужному типу - отследить и пофиксить в ран-тайме.
или телом любого объекта любого типа
-----
Тебе сложно скастить к ссылке на объект с инициированием адресом в стеке?
Разумеется - именно то, что, по факту, прописано в параметрах. Ожидаемое, однако, есть указатель на начало нуль-терминальной строки в сегменте данных.ожидаемо, но проверить что лежащее в стеке является именно указателем - невозможно.
там лежат "числа", которые ты можешь интерпретировать как тебе нужно.мне допустим нужен указательна стринг. Естественно я буду его так и интерпретировать (что делает sprintf и без меня). Но там лежит какой-то INT напр, который при касте к указателю даже указывает на сегмент данных, но естественно либо в мусор, либо в середину какой-нибудь посторонней строки, либо туда где находится 0. Во втором и третьем случаях вообще понять что ошибка - невозможно. И шо теперь делать?
интерпретировать как void* и кастить к нужному типу.к какому именно типу скастить? Ведь нету никакой информации об этом.
Тебе сложно скастить к ссылке на объект с инициированием адресом в стеке?да скастить то не сложно. Сложно понять к чему кастить (а точнее невозможно понять, о чем уже говорилось)
Но там лежит какой-то INT напр
-----
Ты на что изначально жаловался? На то, что местами вместо чар* пихается стд::Стринг. Откуда у тебя вдруг появляется инт Я как-то не понимаю.
к какому именно типу скастить?
-----
К тому который ожидается - стд::стринг. В стеке этой информации разумеется нету, но именно эту часть ты изложил изначально.
Да, еще одна мысль по детектированию проблемы пришла - сравнить глубину стека с ожидаемым количество-размером фактически переданных параметров - смещение до адреса возврата в стеке.
Во втором и третьем случаях вообще понять что ошибка - невозможно. И шо теперь делать?
-----
То же что всегда в Сях - фаулт...
Т.е. Примерно тоже самое когда потрешь адрес возврата в стеке...