Здравствуйте, ononim, Вы писали:
O>Дебажные символы. windbg настраивается на публичный микрософтовский символ-сервер двумя командами: .symfix и .reload O>С чего вы взяли что сохранение бездумное, а функция простейшая? Что за код по адресу WININET!DispatchAPICall+0x3f которая вызывается между сохранением/восстановлением MMX регистров вы смотрели? Ну и к выравниванию стека это вообще отношения не имеет.
По-моему мы друг друга не понимаем. Какие "дебажные символы" отобразятся в командах запоминания? Я в Windbg всего лишь прошел пошагово несколько десятков команд внутри вызова InternetGetConnectedState и обнаружил запоминание/восстановление XMM, хотя по смыслу эта функция всего лишь должна достать внутренний флаг. Запоминание ненужных в данном случае регистров потребовало выравнивания стека на 16, а если бы не было ненужных XMM, достаточно обычного выравнивания на 8.
O>Во-первых, очень часто используется. Во-вторых сохранение SSE2 не предусмотрено calling convention, предусмотрено только выравнивание стека для того чтоб компилятор мог без дополнительных проверок в любом месте воспользоваться SSE. O>В вашем примере компилятор решил сохранить SSE перед вызовом непубличной функции. Это его право, так как для непубличных функций компилятор вправе положить на volatile/preserved registers.
Да пусть себе что хочет делает внутри. А снаружи вызова InternetGetConnectedState зачем знать какие функции он ВНУТРИ вызывает. Если внутри есть экзотические вызовы, пусть внутри и разбирается с дополнительными требованиями. А то так перед ЛЮБЫМ вызовом придется все сохранять и выравнивать. Это потеря времени и увеличение размера кода.
OO>Еще раз: есть пример кода, когда конкретно этот сценарий использования исключений работает некорректно на х64? Или ваши жалобы касаются лишь того что сложно все это понять "на глазок" как оно все теперь работает и быстро на коленке обработать это дело самописным дебаггером?
И опять мы друг друга не поняли. Причем здесь стек? Пример опровергал утверждение
"Работоспособность программы после какого нить illegal instruction или поломанной памяти на самом деле никому не интересна". На мой взгляд, ОС должна передать исключение обработчику, а дальше не ее собачье дело "интересно" это кому-нибудь или "неинтересно". Автор статьи ругается, что исключение есть, обработчик на него есть, а ОС его не вызывает, потому, что дескать стек обязательно должен был быть кратен 8. Ну не кратен 8, аппаратно ведь запрещения на это нет? ОС-то зачем это запрещает?