Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / C++ Новый топик    Ответить
Топик располагается на нескольких страницах: 1 2      [все]
 ABI динамических библиотек  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 52913

Насколько можно полагаться на то, что при передаче функции с соглашением stdcall
компиляторы расширяют короткие целые до размера платформы?

Предположим, у нас есть DLL, с экспортированной foo(short int) и приложение, её
использующее со значением -1. Мы делаем грязный трюк: подсовываем ему DLL, экспортирующую
foo(unsigned int). Можно ли полагаться на то, что новая DLL будет всегда получать от этого
приложения UINT_MAX, а не случайный мусор в старших битах или ещё хуже - поехавшие
параметры после данного?

Posted via ActualForum NNTP Server 1.5

27 янв 21, 19:50    [22270382]     Ответить | Цитировать Сообщить модератору
 Re: ABI динамических библиотек  [new]
mayton
Member

Откуда: loopback
Сообщений: 51015
Кажется short всегда был 16 разрядным. Это int может плавать.
27 янв 21, 22:35    [22270462]     Ответить | Цитировать Сообщить модератору
 Re: ABI динамических библиотек  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 52913

mayton
Кажется short всегда был 16 разрядным.

Вопрос не в его собственной разрядности, а в том как он передаётся в функции динамических
библиотек с соглашением stdcall на платформах в 32 и 64 разряда.

Posted via ActualForum NNTP Server 1.5

27 янв 21, 23:03    [22270470]     Ответить | Цитировать Сообщить модератору
 Re: ABI динамических библиотек  [new]
petrav
Member

Откуда:
Сообщений: 2861
Dimitry Sibiryakov

mayton
Кажется short всегда был 16 разрядным.

Вопрос не в его собственной разрядности, а в том как он передаётся в функции динамических
библиотек с соглашением stdcall на платформах в 32 и 64 разряда.

Основной вопрос: накуа вы это делаете?

Ну и побочные вопросы:

- Алгоритм выравнивания аргументов при упаковке в стек.
- И как они (аргументы) копируются в стек.

Тут нужно читать стандарт. Но я не вижу оснований при копировании в стек поднимать short до int.
Не думаю, что это всё вообще имеет смысл обсуждать.
27 янв 21, 23:16    [22270474]     Ответить | Цитировать Сообщить модератору
 Re: ABI динамических библиотек  [new]
Siemargl
Member

Откуда: 010100
Сообщений: 6419
Dimitry Sibiryakov,

Можно полагаться на системное ABI.

AFAIK там никаких short int нет

https://en.wikipedia.org/wiki/X86_calling_conventions

Сообщение было отредактировано: 28 янв 21, 01:59
28 янв 21, 02:00    [22270517]     Ответить | Цитировать Сообщить модератору
 Re: ABI динамических библиотек  [new]
Barlone
Member

Откуда:
Сообщений: 1452
Dimitry Sibiryakov

Можно ли полагаться на то, что новая DLL будет всегда получать от этого
приложения UINT_MAX, а не случайный мусор в старших битах или ещё хуже - поехавшие
параметры после данного?
Выравнивание ABI гарантирует, следующие параметры не поедут. А вот старшие биты... Тут может зависеть от компилятора
void __stdcall foo(short int);
extern short x[2];
void test() { foo(x[1]); }
gcc и clang выдают что-то такое
	pushl	%eax
movswl _x+2, %eax
movl %eax, (%esp)
calll foo
movswl - загрузка в регистр с расширением знака.
А вот у borland C по-другому
	mov       ax,word ptr [_x+2]
push eax
call foo
и тут в старших битах кажется остался мусор.
28 янв 21, 07:28    [22270541]     Ответить | Цитировать Сообщить модератору
 Re: ABI динамических библиотек  [new]
teo609
Member

Откуда: Рязань
Сообщений: 140
Dimitry Sibiryakov

Насколько можно полагаться на то, что при передаче функции с соглашением stdcall
компиляторы расширяют короткие целые до размера платформы?

Предположим, у нас есть DLL, с экспортированной foo(short int) и приложение, её
использующее со значением -1. Мы делаем грязный трюк: подсовываем ему DLL, экспортирующую
foo(unsigned int). Можно ли полагаться на то, что новая DLL будет всегда получать от этого
приложения UINT_MAX, а не случайный мусор в старших битах или ещё хуже - поехавшие
параметры после данного?

Приложение в точке вызова положит в стек то, что описано в точке вызова. "приложение, её использующее со значением -1" - если за этим стоит нормальный вызов "foo(short int)" то в стек должны пойти 2 байта, а если их читать функцией "foo(unsigned int)" то она возьмет из стека 4 байта. Но, по идее GetProcAddress должен не найти foo(short int) и до вызова не дойдет.
28 янв 21, 11:05    [22270621]     Ответить | Цитировать Сообщить модератору
 Re: ABI динамических библиотек  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 52913

petrav
Основной вопрос: накуа вы это делаете?

Разработка новой версии библиотеки с расширенным функционалом, но сохранением обратной
совместимости как на уровне исходников, так и двоичной.

Posted via ActualForum NNTP Server 1.5

28 янв 21, 14:09    [22270724]     Ответить | Цитировать Сообщить модератору
 Re: ABI динамических библиотек  [new]
mayton
Member

Откуда: loopback
Сообщений: 51015
Надежнее сделать два билд-скрипта. Чтоб собирались фолдеры типa x86, x64 для каждой разрядности.

Ну а в приложении набить "гвоздей" макросами.
28 янв 21, 14:13    [22270728]     Ответить | Цитировать Сообщить модератору
 Re: ABI динамических библиотек  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 52913

Приложения чужие, в них ничего не набьёшь.

Posted via ActualForum NNTP Server 1.5

28 янв 21, 14:19    [22270733]     Ответить | Цитировать Сообщить модератору
 Re: ABI динамических библиотек  [new]
Siemargl
Member

Откуда: 010100
Сообщений: 6419
teo609
Dimitry Sibiryakov

Насколько можно полагаться на то, что при передаче функции с соглашением stdcall
компиляторы расширяют короткие целые до размера платформы?

Предположим, у нас есть DLL, с экспортированной foo(short int) и приложение, её
использующее со значением -1. Мы делаем грязный трюк: подсовываем ему DLL, экспортирующую
foo(unsigned int). Можно ли полагаться на то, что новая DLL будет всегда получать от этого
приложения UINT_MAX, а не случайный мусор в старших битах или ещё хуже - поехавшие
параметры после данного?

Приложение в точке вызова положит в стек то, что описано в точке вызова. "приложение, её использующее со значением -1" - если за этим стоит нормальный вызов "foo(short int)" то в стек должны пойти 2 байта, а если их читать функцией "foo(unsigned int)" то она возьмет из стека 4 байта. Но, по идее GetProcAddress должен не найти foo(short int) и до вызова не дойдет.
Вот только бред писать не надо, ни в зуб ногой в теме
28 янв 21, 15:22    [22270772]     Ответить | Цитировать Сообщить модератору
 Re: ABI динамических библиотек  [new]
petrav
Member

Откуда:
Сообщений: 2861
Barlone
Dimitry Sibiryakov

Можно ли полагаться на то, что новая DLL будет всегда получать от этого
приложения UINT_MAX, а не случайный мусор в старших битах или ещё хуже - поехавшие
параметры после данного?
Выравнивание ABI гарантирует, следующие параметры не поедут.

А если в аргументах только N аргументов типа short и всё, то они все выровняются по границе sizeof(int)?
Всё что меньше int выравнивается в стеке по sizeof(int)?
28 янв 21, 17:10    [22270805]     Ответить | Цитировать Сообщить модератору
 Re: ABI динамических библиотек  [new]
petrav
Member

Откуда:
Сообщений: 2861
Dimitry Sibiryakov

petrav
Основной вопрос: накуа вы это делаете?

Разработка новой версии библиотеки с расширенным функционалом, но сохранением обратной
совместимости как на уровне исходников, так и двоичной.

А следующим шагом захочется добавить ещё один аргумент. А для старой программы, которая не
знает об этом аргументе, использовать значение по умолчанию. И придётся писать промежуточную
DLL, которая будет типы преобразовывать и значения по умолчанию подставлять.

Я бы сразу писал эту прокси-DLL. Мог бы переупорядочить аргументы под новые мысле-пожелания.
28 янв 21, 21:48    [22270904]     Ответить | Цитировать Сообщить модератору
 Re: ABI динамических библиотек  [new]
petrav
Member

Откуда:
Сообщений: 2861
Что-то вспомнилось, есть в WinAPI (GDI) одна волшебная функция. Сигнатура у неё упрощённо такая:

void MyFunc(MY_STRUCT *);

При этом в структуре MY_STRUCT первое поле — это размер структуры типа UINT. Этот размер структуры
является по совместительству идентификатором типа структуры. Туда можно подставить другую структуру
типа MY_STRUCT_EX. Во талант костыли прикручивать, я был очень удивлён.

Вопрос в том, когда функция проектировалась до придумывания костыля, то зачем они первым полем
прописали размер структуры? Ну понятно, что для некоторой дополнительной безопасности. Но… эээ.

Сообщение было отредактировано: 28 янв 21, 22:10
28 янв 21, 22:16    [22270922]     Ответить | Цитировать Сообщить модератору
 Re: ABI динамических библиотек  [new]
mayton
Member

Откуда: loopback
Сообщений: 51015
Если сравнивать с указателями.

Вместо HANDLE сложнее впихнуть другой HANDLE. Ну тоесть использовать имеющийся можешь,
а создать новый хендл - через специальный API.
28 янв 21, 22:38    [22270931]     Ответить | Цитировать Сообщить модератору
 Re: ABI динамических библиотек  [new]
petrav
Member

Откуда:
Сообщений: 2861
mayton
Если сравнивать с указателями.

Вместо HANDLE сложнее впихнуть другой HANDLE. Ну тоесть использовать имеющийся можешь,
а создать новый хендл - через специальный API.

HANDLE — это указатель (или индекс) на структуру в памяти ядра ОС. Я уверен там штатно записан тип
этого дескриптора, а не размер как тип. Это немного другое. Это не костыль. В моём примере была
обычная структура клиентского кода.

Впрочем, HANDLE как некая универсальная штука, которая ссылается на всё что угодно тоже смотрится
диковато. Как-то неправильно…
28 янв 21, 22:53    [22270935]     Ответить | Цитировать Сообщить модератору
 Re: ABI динамических библиотек  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 52913

petrav
Вопрос в том, когда функция проектировалась до придумывания костыля, то зачем они первым
полем прописали размер структуры?

Именно для того, чтобы её можно было расширять. Ты не поверишь, но есть люди, которые
думают наперёд.

Posted via ActualForum NNTP Server 1.5

28 янв 21, 23:03    [22270938]     Ответить | Цитировать Сообщить модератору
 Re: ABI динамических библиотек  [new]
petrav
Member

Откуда:
Сообщений: 2861
Dimitry Sibiryakov

petrav
Вопрос в том, когда функция проектировалась до придумывания костыля, то зачем они первым
полем прописали размер структуры?

Именно для того, чтобы её можно было расширять. Ты не поверишь, но есть люди, которые
думают наперёд.

Если бы эти люди думали наперёд, то они бы в первом поле структуры прописали бы идентификатор типа
структуры, а не воспринимали бы потом размер структуры как id. В том то и дело.
28 янв 21, 23:12    [22270942]     Ответить | Цитировать Сообщить модератору
 Re: ABI динамических библиотек  [new]
petrav
Member

Откуда:
Сообщений: 2861
Dimitry Sibiryakov

petrav
Вопрос в том, когда функция проектировалась до придумывания костыля, то зачем они первым
полем прописали размер структуры?

Именно для того, чтобы её можно было расширять. Ты не поверишь, но есть люди, которые
думают наперёд.

Кроме того мой пример — это исключение в проектировании WinAPI. Обычно они имеют функцию аля ::CreateRemoteThread(), а потом
добавляют функцию ::CreateRemoteThreadEx(). Т.е. это был явный костыль, а не думанье наперёд.

Сообщение было отредактировано: 28 янв 21, 23:35
28 янв 21, 23:39    [22270953]     Ответить | Цитировать Сообщить модератору
 Re: ABI динамических библиотек  [new]
mayton
Member

Откуда: loopback
Сообщений: 51015
petrav

Впрочем, HANDLE как некая универсальная штука, которая ссылается на всё что угодно тоже смотрится
диковато. Как-то неправильно…

Почему неправильно?
29 янв 21, 00:04    [22270963]     Ответить | Цитировать Сообщить модератору
 Re: ABI динамических библиотек  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 52913

petrav
Кроме того мой пример — это исключение в проектировании WinAPI.

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

Posted via ActualForum NNTP Server 1.5

29 янв 21, 01:31    [22270976]     Ответить | Цитировать Сообщить модератору
 Re: ABI динамических библиотек  [new]
petrav
Member

Откуда:
Сообщений: 2861
Dimitry Sibiryakov

petrav
Кроме того мой пример — это исключение в проектировании WinAPI.

Значит ты просто с ним совсем не знаком.

Очень может быть.

Dimitry Sibiryakov
Там такую структуру имеет каждая вторая структура
если не первая.

Размер структуры в первом поле действительно часто используется в WinAPI. Но редко как идентификатор.
Например, в ::CreateProcess() я вижу совсем другую логику, хотя размер структуры там присутствует.

Dimitry Sibiryakov
Размер работает лучше идентификатора версии поскольку даже структуру
неизвестной версии функция может корректно обработать. Например, сериализовать и переслать
кому-нибудь другому.

И часто функции WinAPI могут принять структуру неизвестного размера, потом не распознав её они обязаны её
куда-то переслать или сереализовать? Например, ::CreateProcess() не распознал структуру, но зато её сериализовал и
переслал. И типа всё круто? Гибкость же.

Вы перепутали идентификацию, проверку размера и целепологание.
29 янв 21, 01:53    [22270982]     Ответить | Цитировать Сообщить модератору
 Re: ABI динамических библиотек  [new]
mayton
Member

Откуда: loopback
Сообщений: 51015
Dimitry Sibiryakov

petrav
Кроме того мой пример — это исключение в проектировании WinAPI.

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

+1

Мысль интересная. Это похоже на процессинг XML, когда вы встретили новый неизвестный тег
но не упали с ошибкой а спокойно поскипали и пошли дальше.

Это кстати очень хорошо согласуется с философией сетевых протоколов. Быть маскимально
консервативным при сериализации и максимально либеральным при парсинге.
29 янв 21, 02:27    [22270987]     Ответить | Цитировать Сообщить модератору
 Re: ABI динамических библиотек  [new]
Basil A. Sidorov
Member

Откуда:
Сообщений: 10924
libFFI
?
29 янв 21, 08:34    [22271017]     Ответить | Цитировать Сообщить модератору
 Re: ABI динамических библиотек  [new]
petrav
Member

Откуда:
Сообщений: 2861
mayton
Dimitry Sibiryakov

пропущено...

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

+1

Мысль интересная. Это похоже на процессинг XML, когда вы встретили новый неизвестный тег
но не упали с ошибкой а спокойно поскипали и пошли дальше.

Это кстати очень хорошо согласуется с философией сетевых протоколов. Быть маскимально
консервативным при сериализации и максимально либеральным при парсинге.

Угу... Тут мы не можем ничего скипать и идти спокойно дальше. Программа должна работать
корректно, а не как получится.

То что размер структуры используется что бы повысить вероятность обнаружения сбоя — это понятно.
Костылём является использование размера как идентификатора. Вот в ::CreateProcess() такого
косяка нет, там действительно люди подумали заранее.

MSDN
lpStartupInfo

A pointer to a STARTUPINFO or STARTUPINFOEX structure.

To set extended attributes, use a STARTUPINFOEX structure and specify EXTENDED_STARTUPINFO_PRESENT in the dwCreationFlags parameter.
29 янв 21, 11:39    [22271115]     Ответить | Цитировать Сообщить модератору
 Re: ABI динамических библиотек  [new]
Barlone
Member

Откуда:
Сообщений: 1452
Dimitry Sibiryakov
Размер работает лучше идентификатора версии поскольку даже структуру
неизвестной версии функция может корректно обработать. Например, сериализовать и переслать
кому-нибудь другому.
Не надо функции обрабатывать структуру неизвестного размера. Совместимость там обеспечивается в одну сторону - старая программа, которая не знает о добавленных в структуру полях, запускается на новой версии виндоуз. Функция видит, что размер структуры меньше, и использует для новых полей значения по умолчанию. В обратную сторону никто совместимость не обещал, и если программа передаст размер больше, чем ожидает винда, скорее всего функция вернет ошибку.
29 янв 21, 12:32    [22271152]     Ответить | Цитировать Сообщить модератору
 Re: ABI динамических библиотек  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 7634
Разве тупая пересылка куска байтов заранее неизвестной структуры считается обработкой.?
29 янв 21, 13:19    [22271182]     Ответить | Цитировать Сообщить модератору
 Re: ABI динамических библиотек  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 52913

petrav
Например, в ::CreateProcess() я вижу совсем другую логику, хотя размер структуры там
присутствует.

И это показывает, что даже в MS нет единомыслия и идеи "как делать правильно" мутируют со
временем.

Posted via ActualForum NNTP Server 1.5

29 янв 21, 13:55    [22271214]     Ответить | Цитировать Сообщить модератору
 Re: ABI динамических библиотек  [new]
petrav
Member

Откуда:
Сообщений: 2861
Dimitry Sibiryakov

petrav
Например, в ::CreateProcess() я вижу совсем другую логику, хотя размер структуры там
присутствует.

И это показывает, что даже в MS нет единомыслия и идеи "как делать правильно" мутируют со
временем.

Могу парировать. Функцию ::CreateProcess() проектировали эксперты. А ту функцию из GDI проектировали
программисты второго плана. По понятным причинам. :)
29 янв 21, 23:09    [22271481]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2      [все]
Все форумы / C++ Ответить