−54
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
fstream:=tstreamex.Create(signaturepath,fmShareDenyWrite);
FLock.Enter;
try
while not fstream.EOS do
begin
obj:=tsignature.create;
try
obj.AddingDate:=fstream.ReadDate;
obj.Comment:=fstream.ReadString;
fstream.ReadBuffer(Len, SizeOf(Len));
obj.MStream.SetSize(len);
fstream.ReadBuffer(obj.mstream.memory^, len);
fsignlist.Add(obj);
except
obj.Free;
raise esignatureloadingerror.Create('Signature read error');
end;
Стрим читает из файла сохраненный объект. К сожалению, подобный подход используется даже в серьезных коммерческих проеках, это классика.
Если что-то поменять в файле хоть на 1 байт, стрим промахнётся мимо поля - прога либо съест всю доступную системную память либо обрушится с Access Violation.
В любом случае, память будет испорчена, и дальнейшее выполнение программы чревато UB.
Кстати, а не грозит ли юзание структур порчей памяти? Допустим, хотим определить валидность заголовка, загружаем структуру, а в файле - трешак.
Не будет ли обращения по ложному адресу? UB?
Запостил: voodoodal16,
24 Сентября 2016
bagor 24.09.2016 16:41 # −123
guest 24.09.2016 17:43 # −56
Увижу при встрече, сыпану в глаза тебе горчичный порошок. Пока ты корчишься от боли, я привяжу тебя чтоб не дергался. Досыплю порошка в глаза и перемешаю в глазницах. Возьму связку сосисок и выебу тебя, как анальными бусами. Дальше взглотнешь 2 литра колы и насильно засуну в тебя ментос, чтоб твое ебало посинело. Пока ты синеешь и кричишь (От удовольствия или боли?), вспорю пузо и толстую кишку и вытощу ту связку сосисок с говном, намажу тем самой глазной горчицей и засуну в тебя. Возможно тебя вырвет, но советую этого не делать.
voodoodal16 24.09.2016 18:59 # −57
Этот смайл ступорит меня.
bagor 24.09.2016 20:16 # −122
bagor 24.09.2016 20:22 # −122
guest8 07.09.2019 11:39 # −999
CTOMATOJlOr 17.11.2022 01:01 # 0
voodoodal16 24.09.2016 19:08 # −57
guest 24.09.2016 19:30 # −56
voodoodal16 24.09.2016 21:15 # −58
barop 24.09.2016 21:30 # −57
писать на дельфях в 2016м это самая что ни на есть анскилябрщина
dxd 24.09.2016 21:35 # −57
voodoodal16 24.09.2016 21:46 # −58
3_14dar 24.09.2016 22:46 # −58
voodoodal16 24.09.2016 23:18 # −57
kipar 25.09.2016 11:31 # −56
Настоящая анскилябрщина - считать что год написания имеет какое-то отношение к анскилябрщине.
bormand 25.09.2016 11:37 # −56
voodoodal16 25.09.2016 20:43 # −56
BagorCtretora 26.09.2016 13:16 # −121
guest8 07.09.2019 14:12 # −999
cmepmop 08.09.2019 17:44 # 0
guest8 08.09.2019 17:52 # −999
guest8 08.09.2019 18:27 # −999
cmepmop 08.09.2019 19:37 # 0
3_14dar 24.09.2016 22:47 # −55
voodoodal16 24.09.2016 23:27 # −58
bagor 25.09.2016 00:13 # −122
voodoodal16 24.09.2016 23:24 # −57
Вы словно голуби: только "курлы-мурлы", а пользы - 0. Только белье на веревке пачкаете.
bagor 25.09.2016 00:15 # −120
voodoodal16 25.09.2016 00:40 # −57
http://govnokod.ru/20875
huesto 25.09.2016 00:01 # −58
kipar 25.09.2016 11:35 # −56
Не будет ли обращения по ложному адресу? UB?
Э, да ты совсем нуб что ли. Если размер файла меньше размера структуры то прочитать не удастся, будет исключение. А если больше - все поля прочитаются. Ну да, в полях может быть мусор, на то он и заголовок что надо будет сигнатуры сравнить, но откуда там ложные адреса и UB?
voodoodal16 25.09.2016 20:39 # −56
Если вылетело исключение - разве сие не знак того, что испорчена память? Вдруг код затёр служебные заголовки? Мусор в полях - тоже UB, как мне кажется.
kipar 26.09.2016 00:43 # −56
Ну тогда при объявлении любой локальной переменной происходит UB. Это уже потом мы присваиваем ей значение, а до этой строчки с присвоением - полнейшее UB.
bormand 26.09.2016 17:42 # −55
Поэтому и советуют инициализировать переменную сразу в объявлении.
barop 26.09.2016 18:00 # −57
Ну типа
char *foo;
*(foo) = 1; //превратились в кирпич или сожгли оборудование
bormand 26.09.2016 18:52 # −56
Ну MMIO тебе ось в адресное пространство не замапает просто так. А вот если без оси...
barop 26.09.2016 19:05 # −57
Кстати!! Расскажи мне как работает MMIO и DMA при наличии MMU?
Драйвер как-то умно читает таблицы странц и вычисляет настоящий адрес?
bormand 26.09.2016 19:33 # −55
Да там у ядер специальные апишки для трансляции адресов есть, чтобы драйверы не заморачивались. Типа "выдели мне непрерывный кусок физической памяти чтобы до него могла дотянуться вот эта железка и дай адрес, который можно ей скормить" или "замапай мне mmio адреса вот этой железки". И дальше там ядро настраивает все кеши, смещения на мостах, IOMMU если есть и т.п.
barop 26.09.2016 19:39 # −57
Типа драйвер просит у ядра буфер, и скармиливает его адрес DMAшке на борту карты, и карта туда пишет-пишет и потом делает interrupt?
а MMIO как?
Ну вот сидит карта на шине и слушает адреса с FOO по BAR.
Если я сделаю mov [FOO], 42 то FOO через MMU преврарится в черте-чо. Как же драйвер умеет записать ИМЕННО в FOO?
barop 26.09.2016 19:50 # −57
вот я в глаза долблюсь
теперь понятно
типа я говорю едру "пиши по адресу 0x1234", а оно само через таблицы высчитывает реальный адрес
да?
bormand 26.09.2016 19:53 # −56
barop 26.09.2016 19:58 # −57
bormand 26.09.2016 19:58 # −56
barop 26.09.2016 20:01 # −57
иными словами процессор ВСЕГДА обращение к памяти прогоняет через MMU, но ядро настраивает таблицы так, что MMU мапит такие обращения не абы-куда а в нужное место.
ужасная жесть этот ваш протектед мод
то-ли дело дос:
bormand 26.09.2016 20:06 # −56
Так точно.
> ужасная жесть этот ваш протектед мод
Запили свою 64-битную ось с маппингом 1:1 :)
barop 26.09.2016 20:13 # −57
Программ-то больше чем одна)
bormand 26.09.2016 20:36 # −56
Ну сделай почти-однозадачную, как DOS.
З.Ы. Первые iOS'ы вроде тоже как китайские телефоны были - в фоне только плейер да будильник. И ничё, пипл хавал...
barop 26.09.2016 20:50 # −57
Вполне себе многозадачненько! Причем если запрограммировать таймеры (там же их было два вроде) то чем не многозадачность?;)
Причем не было гонок, не нужно было делать fence потому что DOS не умел более одного CPU (да?).
у iOS это связано с желанием не тратить батарейку на всяких пидарасов. Технически Darwin @ XNU вполне себе многозадачна, как ты понимаешь:)
Кстати говоря даже сейчас чтобы что-то делать в офне нужно это явно попросить (через plist) и список дел крайне ограничен) Тебя либо "иногда будут будить", либо разрешат быть всегда в фоне если ты плеер или навигатор.
Ну то-есть нельзя невозбранно простые числа искать за счет пользователя в фоне. А в ондроиде можно)
bormand 26.09.2016 20:53 # −56
Если есть право на wake lock. Иначе телефон всё-таки забьёт и уснёт.
barop 26.09.2016 20:54 # −57
но сервис-то можно сделать
bormand 26.09.2016 20:56 # −56
Один хуй засыпает... Без wake lock у меня не получалось нормально дёргать странички с ГК. Сервис просыпался только с какими-нибудь гугловскими прогами или когда экран включал... Алармы тоже не особо помогают без лока, чуть управление вернёшь - сразу в сон.
barop 26.09.2016 21:00 # −57
ты можешь поклянчить еще, но не факт что дадут
Так что даже если телефон не спит, то тебя могут выкинуть нахуй (если памяти мало) и фиг ты чего сделаешь
bormand 26.09.2016 21:04 # −56
Ну это и на андроиде так. Не дрючить же флешку свопом.
barop 26.09.2016 21:19 # −57
https://developer.android.com/guide/components/services.html
А в ios у тебя такого понятия нет. Ты можешь только попросить будить тебя _иногда_.
Ну либо ты особенный (например, плеер)
https://developer.apple.com/library/content/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html
roman-kashitsyn 25.09.2016 11:38 # −57
bormand 25.09.2016 11:41 # −55
bormand 25.09.2016 11:46 # −57
voodoodal16 25.09.2016 20:40 # −57
bormand 25.09.2016 20:52 # −55
guestinho 25.09.2016 21:40 # −56
voodoodal16 25.09.2016 22:30 # −56
Ну и как их проверить? Ведь в любом случае будет утечка памяти.
guestinho 25.09.2016 22:35 # −56
huesto 26.09.2016 12:48 # −56
huesto 26.09.2016 12:49 # −57
roman-kashitsyn 25.09.2016 23:11 # −55
Написание "нормального" сериализатора/десиализатора — задача сама по себе нетривиальная, особенно, если нужно энкодить указатели.
Какую именно проблему решаем-то?
Если хочется не читать гигабайты при случайных повреждениях — добавляем чексуммы + проверяем, что размеры буферов адекватные.
Когда я пилил специализированную штуку для хранения на диске, я вообще ничего в память не копировал: хранил файлы так, чтобы их можно было mmap-ить в память + использовал чексуммы для проверки записей.
Правда, была завязка на 64-разрядные системы — файлы были большие.
BagorCtretora 25.09.2016 23:32 # −122
huesto 25.09.2016 23:36 # −57
BagorCtretora 25.09.2016 23:38 # −122
huesto 25.09.2016 23:45 # −58
roman-kashitsyn 25.09.2016 23:52 # −56
Это ещё до яндекса было, но в яндексе тоже любят mmap.
Не столько из-за выигрыша пирфоманса на копировании (который не такой уж и большой, кстати), сколько из возможности быстро начать обрабатывать запросы, не дожидаясь, пока распарсится в память здоровенный индекс.
BagorCtretora 25.09.2016 23:54 # −121
LispGovno 25.09.2016 23:57 # −56
Я даже больше тебе скажу. При передачи из ядра в память приложения - они копируются ещё раз. С винта читается в буфер через DMA, а он может работать только с данными выравненными на границу параграфа. Да и не гоже читать в чужую память, ибо глядишь пока драйвер "дмашкой" будет выжидать раскручивания цилиндров винта и затем хреначить в буфер юзера - процесс за это время успеет повалится. Так что сначала хуярят в страницу в кернелспейсе, а потом в страницу юзерспейса уже перекопирывают. А там ещё всякие промежуточные менеджеры есть в оси в стеке драйверов, которым нужно поснифать твои буфера для каспера например или что-то ещё сделать, так что и там все копируется в очередной раз. Так что не так страшно будет пару копирований или десятка. С винта все равно на много порядков медленне поднимается. Ну а так да, если мапиш память - там групка страниц сразу переписывается с винта, а потом без копирований эта групка страниц просто ремапится изкернелспейса драйвера в юзерспейс. В целом ммапингчтение обычно медленне обычного чтения, так как префетча обычно нет или он работает адекватно только под некоторые применения в приложениях.
huesto 26.09.2016 00:05 # −57
Шта? Я и сказал, что сначала кусок файла вычитывается в страницу пейджкеша, а потом копируется в юзерспейс. Где там "еще раз"?
LispGovno 26.09.2016 00:12 # −56
А так нагрузка на системный своп сильно снижается с юзаньем мапинга, тк по сути замапленный файл становится свопфайлом и можно любую давно не юзанную страницу выгрузить, а вот если ты себе закопировал обычным ридом в буфер приложухи в хип - тут этот буфер только в основной системный своп отправлять, которого может и не хватить
huesto 26.09.2016 00:17 # −57
LispGovno 26.09.2016 00:28 # −56
> Я не втыкаю
А я зато втыкнул защеку, проверь
> Я не втыкаю
Да не страшно.
huesto 26.09.2016 00:29 # −58
LispGovno 26.09.2016 00:33 # −56
Я это к тому, что копирований больше чем ты думаешь и это на перформанс не особо то влияет из-за латентности винта
huesto 26.09.2016 00:41 # −57
LispGovno 26.09.2016 01:13 # −57
Ты же сам сказал что ты думаешь. Или ты говоришь не то, что думаешь? Или ты говоришь не думая?
guestinho 26.09.2016 01:34 # −58
guestinho 26.09.2016 01:35 # −58
LispGovno 26.09.2016 01:18 # −57
У обычного рида тоже плюсы свои есть. У него больше троугхпут и лучше работа кешера с точки зрения кешмисов, чем у ммапа, так что ещё бабушка на двое сказала, что лучше для конкретной ситуации. Не чего думать категорями царских оптимизаций экономий на спичках
CrashTesterAnusov 26.09.2016 01:25 # −121
CrashTesterAnusov 26.09.2016 00:41 # −119
CTOMATOJlOr 17.11.2022 01:06 # 0
Покайся, покайся!..
3uMuCTOH 17.11.2022 01:08 # 0
CrashTesterAnusov 25.09.2016 23:48 # −121
huesto 25.09.2016 23:54 # −58
voodoodal16 26.09.2016 12:20 # −58
>>Если хочется не читать гигабайты при случайных повреждениях — добавляем чексуммы + проверяем, что размеры буферов адекватные.
У меня так сделано, но почему-то это показалось мне хаком. Оказывается, не ламерство.
BagorCtretora,
huesto,
guestinho,
CrashTesterAnusov,
bagor,
barop
- попадают в список свитка-минусатора. Вы для меня больше не существуете. Прощайте.
huesto 26.09.2016 12:47 # −58
BagorCtretora 26.09.2016 13:15 # −122
guestinho 26.09.2016 22:07 # −57
Очень сильно рискуешь, за нами большая армия ботов.
CrashTesterAnusov 26.09.2016 23:17 # −121
guestinho 26.09.2016 23:25 # −57
huesto 26.09.2016 23:27 # −57
LispGovno 27.09.2016 00:59 # −55
CrashTesterAnusov 27.09.2016 01:09 # −120
LispGovno 27.09.2016 03:56 # −56
huesto 27.09.2016 04:00 # −58
LispGovno 27.09.2016 04:43 # −58
CrashTesterAnusov 27.09.2016 05:43 # −121
kipar 27.09.2016 10:28 # −57
Надеюсь, в виме сидишь, не правишь в ide повторяющиеся строки руками?
LispGovno 27.09.2016 11:04 # −58
CrashTesterAnusov 27.09.2016 12:30 # −121
guest 27.09.2016 13:19 # −58
guestinho 27.09.2016 12:36 # −57
guest 27.09.2016 13:19 # −58
barop 27.09.2016 21:53 # −58
ахахахаха
и в нотпаде тоже, ага
barop 27.09.2016 21:54 # −55
чтобы копипаст не стал проблемой
guest 27.09.2016 22:41 # −58
guestinho 27.09.2016 12:34 # −56
BagorCtretora 27.09.2016 14:15 # −122
guest 27.09.2016 18:15 # −58
guest8 07.09.2019 11:42 # −999
guest8 07.09.2019 11:41 # −999
guest8 07.09.2019 14:10 # −999