Получение пользовательского пользовательского значения поля (expando) в Liferay

Это из-за дополнения добавленного для удовлетворения ограничений выравнивания. выравнивание Структуры данных влияние и производительность и правильность программ:

  • Неправильно выровненный доступ мог бы быть серьезной ошибкой (часто SIGBUS).
  • Неправильно выровненный доступ мог бы быть исправимой ошибкой.
    • Любой исправленный в аппаратных средствах, для скромного снижения производительности.
    • Или исправленный эмуляцией в программном обеспечении, для серьезного снижения производительности.
    • , Кроме того, атомарность и другие гарантии параллелизма могли бы быть повреждены, ведя к тонким ошибкам.

Вот пример с помощью типичных настроек для x86 процессора (все использовали режимы на 32 и 64 бита):

struct X
{
    short s; /* 2 bytes */
             /* 2 padding bytes */
    int   i; /* 4 bytes */
    char  c; /* 1 byte */
             /* 3 padding bytes */
};

struct Y
{
    int   i; /* 4 bytes */
    char  c; /* 1 byte */
             /* 1 padding byte */
    short s; /* 2 bytes */
};

struct Z
{
    int   i; /* 4 bytes */
    short s; /* 2 bytes */
    char  c; /* 1 byte */
             /* 1 padding byte */
};

const int sizeX = sizeof(struct X); /* = 12 */
const int sizeY = sizeof(struct Y); /* = 8 */
const int sizeZ = sizeof(struct Z); /* = 8 */

можно минимизировать размер структур путем сортировки участников по выравниванию (сортирующий по размеру, достаточен для этого в основных типах) (как структура Z в примере выше).

ВАЖНОЕ ПРИМЕЧАНИЕ: И C и стандарты C++ указывают, что выравнивание структуры определяется реализацией. Поэтому каждый компилятор может принять решение выровнять данные по-другому, приведя к различным и несовместимым форматам данных. Поэтому при контакте с библиотеками, которыми будут пользоваться различные компиляторы, важно понять, как компиляторы выравнивают данные. Некоторые компиляторы имеют настройки командной строки и/или особенный #pragma операторы для изменения настроек выравнивания структуры.

6
задан Daniel Kreiseder 28 September 2011 в 16:11
поделиться

1 ответ

Это была проблема безопасности ...

В com.liferay.portlet.expando.service.impl .ExpandoValueServiceImpl.getData (String className,

8
ответ дан 10 December 2019 в 02:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: