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

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

503  1 2 все
Murr_0002 постоялец07.06.17 23:52
Murr_0002
NEW 07.06.17 23:52 
в ответ anly 07.06.17 23:00

Ну а обработать по месту уже совсем никак? улыб

#21 
anly коренной житель08.06.17 00:14
anly
NEW 08.06.17 00:14 
в ответ Murr_0002 07.06.17 23:52

не понял: как обработать?

Вместо вылета выдать сообщение об ошибке что-ли? Так это тоже заказчику не понравится.

Проклят нарушающий межи ближнего своего (Втор.27:17)
#22 
Murr_0002 постоялец08.06.17 00:46
Murr_0002
NEW 08.06.17 00:46 
в ответ anly 08.06.17 00:14

Пыхх... Я думал что ты понимаешь что предлагалось сделать...


Ладушки, опишу чуть подробнее.

В стек для спринтф() в любом случае ляжет указатель.

Либо на строку - тогда указатель на сегмент данных, либо на объект - тогда указатель на сегмент кода.

Соответственно, для ес-процент проверяешь куда указатель, объектный кастишь к типу объекта и вызываешь метод конверсии.

Метод вернет указатель на реальную строку и уже через этот указатель отдаешь ес-проценту.

Ну и не помешает в лог капнуть что такое имело место и где именнo...

#23 
anly коренной житель08.06.17 07:16
anly
NEW 08.06.17 07:16 
в ответ Murr_0002 08.06.17 00:46, Последний раз изменено 08.06.17 07:24 (anly)
В стек для спринтф() в любом случае ляжет указатель

ничего подобного! Ляжет то что было подставлено в аргументе. Может даже класс любого размера.

кастишь к типу объекта

тип узнать невозможно. я уже говорил: в стеке лежат какието числа, которые могут быть чем угодно: указателем, интом, доублом, или телом любого объекта любого типа, даже такого у которого никаких строк и в помине нет

Проклят нарушающий межи ближнего своего (Втор.27:17)
#24 
Murr_0002 постоялец08.06.17 11:12
Murr_0002
NEW 08.06.17 11:12 
в ответ anly 08.06.17 07:16

Ляжет то что было подставлено в аргументе.

-----

Разумеется - именно то, что, по факту, прописано в параметрах.

Ожидаемое, однако, есть указатель на начало нуль-терминальной строки в сегменте данных.


в стеке лежат какието числа, которые могут быть чем угодно

-----

Ээээ... там лежат "числа", которые ты можешь интерпретировать как тебе нужно. Для спецификатора

'%s'

ты должен ожидать "указатель-на-строку" (в сегменте данных).

Если данные не соответствуют ожидаемым, т.е. имеется "указатель-в-другой-сегмент", то с его можно

интерпретировать как

void*

и кастить к нужному типу. Ну или смотреть что по факту компилятор туда складывает.

То. что у тебя может быть набор параметров никак не соответствующий заданному формату - это понятно, но в Сях с эллипсисом оно таково изначально и не решаемо средствами Сей.

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



или телом любого объекта любого типа

-----

Тебе сложно скастить к ссылке на объект с инициированием адресом в стеке? безум

#25 
anly коренной житель08.06.17 18:05
anly
NEW 08.06.17 18:05 
в ответ Murr_0002 08.06.17 11:12, Последний раз изменено 08.06.17 18:08 (anly)
Разумеется - именно то, что, по факту, прописано в параметрах. Ожидаемое, однако, есть указатель на начало нуль-терминальной строки в сегменте данных.
ожидаемо, но проверить что лежащее в стеке является именно указателем - невозможно.
там лежат "числа", которые ты можешь интерпретировать как тебе нужно.
мне допустим нужен указательна стринг. Естественно я буду его так и интерпретировать (что делает sprintf и без меня). Но там лежит какой-то INT напр, который при касте к указателю даже указывает на сегмент данных, но естественно либо в мусор, либо в середину какой-нибудь посторонней строки, либо туда где находится 0. Во втором и третьем случаях вообще понять что ошибка - невозможно. И шо теперь делать?
интерпретировать как void* и кастить к нужному типу.
к какому именно типу скастить? Ведь нету никакой информации об этом.
Тебе сложно скастить к ссылке на объект с инициированием адресом в стеке?
да скастить то не сложно. Сложно понять к чему кастить (а точнее невозможно понять, о чем уже говорилось)
Проклят нарушающий межи ближнего своего (Втор.27:17)
#26 
Murr_0002 постоялец08.06.17 21:17
Murr_0002
NEW 08.06.17 21:17 
в ответ anly 08.06.17 18:05

Но там лежит какой-то INT напр

-----

Ты на что изначально жаловался? На то, что местами вместо чар* пихается стд::Стринг. Откуда у тебя вдруг появляется инт Я как-то не понимаю.


к какому именно типу скастить?

-----

К тому который ожидается - стд::стринг. В стеке этой информации разумеется нету, но именно эту часть ты изложил изначально.


Да, еще одна мысль по детектированию проблемы пришла - сравнить глубину стека с ожидаемым количество-размером фактически переданных параметров - смещение до адреса возврата в стеке.


Во втором и третьем случаях вообще понять что ошибка - невозможно. И шо теперь делать?

-----

То же что всегда в Сях - фаулт...

Т.е. Примерно тоже самое когда потрешь адрес возврата в стеке... смущ

#27 
anly коренной житель08.06.17 22:18
anly
NEW 08.06.17 22:18 
в ответ Murr_0002 08.06.17 21:17

std::string был как пример.

да в любом случае ловить ошибку в рантайме не примемлимо

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