Использование LDT (локальная таблица дескрипторов)

В то время как можно использовать регулярное выражение для парсинга данных между открывающими и закрывающими тэгами, необходимо хорошо подумать относительно того, является ли это путем, по которому Вы хотите спуститься. Причиной его является потенциал тегов к вложенному множеству: если вложенные теги могли бы когда-либо происходить или могут когда-либо происходить, язык, как говорят, больше не является регулярным, и регулярные выражения прекращают быть надлежащим инструментом для парсинга его.

Много реализаций регулярного выражения, таких как PCRE или регулярные выражения perl, отслеживание в обратном порядке поддержки, которое может использоваться для достижения этого грубого эффекта. Но PCRE (в отличие от жемчуга) не поддерживает неограниченное отслеживание в обратном порядке, и это может на самом деле вызвать вещи прервать странные пути, как только у Вас есть слишком много тегов.

существует очень обычно цитируемое сообщение в блоге, которое обсуждает это больше, http://kore-nordmann.de/blog/do_NOT_parse_using_regexp.html (Google для него, и проверяйте кэш в настоящее время, у них, кажется, есть некоторое время простоя)

8
задан starblue 20 November 2009 в 20:12
поделиться

1 ответ

Я могу только догадываться, так как у меня нет доступной сборки.

Я предполагаю, что строка, в которой вы получаете segfault, компилируется примерно так:

mov ds:[offset mx], 0x407cafe

Где смещение mx - это смещение к mx в сегменте данных программы (если это статическая переменная) или в стеке (если это автоматическая переменная). В любом случае это смещение вычисляется во время компиляции, и оно будет использоваться независимо от того, на что указывает DS .

Теперь вы создали новый сегмент, основание которого находится в адрес mx , предел которого равен 0x4 или 0x4fff (в зависимости от G-бита , который вы не указали).

Если G-бит равен 0, то предел равен 0x4 , и поскольку маловероятно, что mx находится между адресами 0x0 и 0x4 исходной DS , при доступе к смещению mx внутри нового сегмента вы пересекаете предел.

Если G-бит равен 1, то предел равен 0x4fff . Теперь вы получите segfault только в том случае, если исходный mx был расположен выше 0x4fff .

Учитывая, что база нового сегмента находится на mx , вы можете получить доступ к mx , выполнив:

mov ds:[0], 0x407cafe

Но я не знаю, как бы я написал это на C.

когда вы получаете доступ к смещению до mx внутри нового сегмента, вы пересекаете предел.

Если G-бит равен 1, то предел равен 0x4fff . Теперь вы получите segfault только в том случае, если исходный mx был расположен выше 0x4fff .

Учитывая, что база нового сегмента находится на mx , вы можете получить доступ к mx , выполнив:

mov ds:[0], 0x407cafe

Я не знаю, как бы я написал это на C.

когда вы получаете доступ к смещению до mx внутри нового сегмента, вы пересекаете предел.

Если G-бит равен 1, то предел равен 0x4fff . Теперь вы получите segfault только в том случае, если исходный mx был расположен выше 0x4fff .

Учитывая, что база нового сегмента находится на mx , вы можете получить доступ к mx , выполнив:

mov ds:[0], 0x407cafe

Но я не знаю, как бы я написал это на C.

6
ответ дан 5 December 2019 в 22:19
поделиться
Другие вопросы по тегам:

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