В то время как можно использовать регулярное выражение для парсинга данных между открывающими и закрывающими тэгами, необходимо хорошо подумать относительно того, является ли это путем, по которому Вы хотите спуститься. Причиной его является потенциал тегов к вложенному множеству: если вложенные теги могли бы когда-либо происходить или могут когда-либо происходить, язык, как говорят, больше не является регулярным, и регулярные выражения прекращают быть надлежащим инструментом для парсинга его.
Много реализаций регулярного выражения, таких как PCRE или регулярные выражения perl, отслеживание в обратном порядке поддержки, которое может использоваться для достижения этого грубого эффекта. Но PCRE (в отличие от жемчуга) не поддерживает неограниченное отслеживание в обратном порядке, и это может на самом деле вызвать вещи прервать странные пути, как только у Вас есть слишком много тегов.
существует очень обычно цитируемое сообщение в блоге, которое обсуждает это больше, http://kore-nordmann.de/blog/do_NOT_parse_using_regexp.html (Google для него, и проверяйте кэш в настоящее время, у них, кажется, есть некоторое время простоя)
Я могу только догадываться, так как у меня нет доступной сборки.
Я предполагаю, что строка, в которой вы получаете 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.