Проверить выравнивание данных в памяти
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 12.07.17 11:04
Оценка:
Есть много кода, который самостоятельно вычисляет смещения данных в памяти и потом там размещает структуры.

Появилась мысль — проверить корректность выравнивания данных.

То есть, чтобы в случае некорректного выравнивания генерировалось исключение.

Не подскажете — как такое реализовать?

Надо как-то хитро откомпилировать бинарник или что-то вызвать из WIN API?
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re: Проверить выравнивание данных в памяти
От: Alexander G Украина  
Дата: 12.07.17 11:36
Оценка:
Здравствуйте, Коваленко Дмитрий, Вы писали:


КД>Появилась мысль — проверить корректность выравнивания данных.


КД>То есть, чтобы в случае некорректного выравнивания генерировалось исключение.


Это SetErrorMode с SEM_NOALIGNMENTFAULTEXCEPT.

Но дело в том, что
* Дефолт — исключения, это есть опция их выключить.
* На x86 и x64 обычные инструкции не требует выравнивания. А необычные (требующие выравнивания) компилятор не будет вставлять при доступе по указателю сомнительного происхождения.
Русский военный корабль идёт ко дну!
Re[2]: Проверить выравнивание данных в памяти
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 12.07.17 15:37
Оценка:
Здравствуйте, Alexander G, Вы писали:

КД>>Появилась мысль — проверить корректность выравнивания данных.


КД>>То есть, чтобы в случае некорректного выравнивания генерировалось исключение.


AG>Это SetErrorMode с SEM_NOALIGNMENTFAULTEXCEPT.


Попробую, но, по-моему, это как раз выключает исключение

SEM_NOALIGNMENTFAULTEXCEPT

The system automatically fixes memory alignment faults and makes them invisible to the application. It does this for the calling process and any descendant processes. This feature is only supported by certain processor architectures. For more information, see the Remarks section.

-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re[3]: Проверить выравнивание данных в памяти
От: Alexander G Украина  
Дата: 12.07.17 15:46
Оценка:
Здравствуйте, Коваленко Дмитрий, Вы писали:

КД>Попробую, но, по-моему, это как раз выключает исключение


Да, выключает. И только на Itanium.
Привёл как ориентир, где эту опцию искать, и что на х86 и х64 её, фактически, нет за ненадобностью.
Русский военный корабль идёт ко дну!
Re[4]: Проверить выравнивание данных в памяти
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 12.07.17 16:27
Оценка:
Здравствуйте, Alexander G, Вы писали:

AG>Здравствуйте, Коваленко Дмитрий, Вы писали:


КД>>Попробую, но, по-моему, это как раз выключает исключение


AG>Да, выключает. И только на Itanium.

AG>Привёл как ориентир, где эту опцию искать, и что на х86 и х64 её, фактически, нет за ненадобностью.

Попробовал.

GetErrorMode возвращает 0.

Тем не менее, код
char test[2+sizeof(__int64)]={};
__int64 i64=*reinterpret_cast<const __int64*>(&test[2]);

работает без проблем — без исключений.

В отладчике установлена галочка у исключения "Datatype misalignment".

Жаль.

Меня тут терзают смутные сомнения — по моему, у меня в одном .NET приложении (C#, Win, Intel) были проблемы с выравниванием и исключение таки генерировалось...
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re: Проверить выравнивание данных в памяти
От: ononim  
Дата: 12.07.17 20:49
Оценка:
КД>Не подскажете — как такое реализовать?
КД>Надо как-то хитро откомпилировать бинарник или что-то вызвать из WIN API?
Запустить прогу под кастомным отладчиком, который будет трейсить инструкции по одной, дизасмить и смотреть по каким адресам происзодят обраения. Можно набадяжить скриптик для windbg.
Как много веселых ребят, и все делают велосипед...
Re[2]: Проверить выравнивание данных в памяти
От: EreTIk EreTIk's Box
Дата: 13.07.17 17:56
Оценка:
Здравствуйте, ononim, Вы писали:

КД>>Не подскажете — как такое реализовать?

КД>>Надо как-то хитро откомпилировать бинарник или что-то вызвать из WIN API?
O>Запустить прогу под кастомным отладчиком, который будет трейсить инструкции по одной, дизасмить и смотреть по каким адресам происзодят обраения. Можно набадяжить скриптик для windbg.

По скорости исполнения, вероятно, будет быстрее инструментация PIN'ом:

$ ../../../pin -t obj-intel64/pinatrace.so -- /bin/ls
Makefile          atrace.o    imageload.o    inscount0.o  itrace.out
Makefile.example  atrace.out  imageload.out  itrace       proccount
atrace            imageload   inscount0      itrace.o     proccount.o
$ head pinatrace.out
0x40001ee0: R 0xbfffe798
0x40001efd: W 0xbfffe7d4
0x40001f09: W 0xbfffe7d8
0x40001f20: W 0xbfffe864
0x40001f20: W 0xbfffe868
0x40001f20: W 0xbfffe86c
0x40001f20: W 0xbfffe870
0x40001f20: W 0xbfffe874
0x40001f20: W 0xbfffe878
0x40001f20: W 0xbfffe87c
$

 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.