ФлеймФорумПрограммирование

Опасности приведения типов в Delphi

#0
10:03, 1 сен 2025

Возник такой вопрос. Предположим, у меня есть тип TIndex=0..199; Есть класс tstringlist, в который я добавляю строки через addobject – второй параметр указывается как tobject(currentindex), где currentindex имеет тип tindex.
При объявлении типа TIndex=0..199, размер его делается равным байту или стандартному интегеру? Если первое, то при приведении этого типа в tobject, возможно в tobject запишутся случайные байты из стека или кучи, находящиеся рядом с currentindex, и это багоопасно?
update Я сейчас проверил – вроде размер будет таки один байт. Значит надо помнить об этой угрозе? Как её ликвидировать? Поскольку у меня очень плохая память, я думаю сделать дополнительный тип – памятку TIndexSaveConvert=type integer, чисто чтобы не забывать.

#1
(Правка: 10:13) 10:10, 1 сен 2025

Vit Nhoc
> возможно в tobject запишутся случайные байты из стека или кучи
даже если так - ты же потом приведешь назад к TIndex и эти байты отрежутся ни на что не повлияв. Всю жизнь типы меньшего размера к TObject приводил и ничего не было.

---
для си кстати тоже актуально - там часто в каллбеках есть void* additional_data, а туда вместо указателя хочется енум передать.

#2
10:51, 1 сен 2025

kipar
> даже если так - ты же потом приведешь назад к TIndex и эти байты отрежутся ни на что не повлияв.

Да, но те кто познал Дао программирования знают, что возможны самые разные ситуации, в том числе когда этот tobject потребуется преобразовать не в tindex, а в integer. Хотя бы из забывчивости, если я например привык всегда делать счётчик цикла типом integer.

#3
10:56, 1 сен 2025

Vit Nhoc
Сам-то как думаешь, вот есть структура из 4 байтов и ты последний (или первый) кладешь в integer обычным оператором присваивания, что происходит?
1. Туда пишется мусор из соседних байтов
2. Там остается мусор из соседних байтов
3. Высокоуровневые языки на то и высокоуровневые что за тебя предусмотрели считывание одиночного байта и расширение его до полноценного регистра

#4
12:04, 1 сен 2025

Vit Nhoc
> Значит надо помнить об этой угрозе? Как её ликвидировать?

+ вариант 1
+ вариант 2
+ вариант 3

Vit Nhoc
> я думаю сделать дополнительный тип – памятку TIndexSaveConvert=type integer, чисто чтобы не забывать.
а в 64-битность?

ФлеймФорумПрограммирование