【问题标题】:libxml2 on iOS causing EXC_BAD_ACCESS errors when parsing HTML with HTMLParseriOS 上的 libxml2 在使用 HTMLParser 解析 HTML 时导致 EXC_BAD_ACCESS 错误
【发布时间】:2012-08-06 05:34:18
【问题描述】:

我一直在做一个项目,该项目使用 libxml2 HTMLParser 模块来解析 iOS 上的网页 HTML。每当我尝试解析包含以下行的网页时,我都会从 libxml2 的 htmlParseDocument 中收到 EXC_BAD_ACCESS 错误:

<?xml version="1.0" encoding="UTF-8"?>

如果我从 HTML 中去掉这一行,解析就完美了。

另外请注意,我正在使用 DTHTMLParser 类将 libxml2 SAX 回调绑定到 Objective-C 代码。

由于 htmlParseDocument 中的 EXC_BAD_ACCESS 没有太多可做的,我已经构建了一个示例 Xcode 项目来重现错误。我在针对 iOS 5.1 的 Mountain Lion 上的 Xcode 4.4 中制作了它。首先,它解析一个不包含违规行的 HTML 文件,然后它尝试解析包含违规行的文档并崩溃。你可以在这里下载:http://michaelmanesh.com/code/libxml2-crash.zip

【问题讨论】:

    标签: objective-c ios exc-bad-access libxml2


    【解决方案1】:

    DTHTMLParser 中的问题显然是在 libxml 中准备 c-callbacks 的方法没有将遇到处理指令时要调用的函数的函数指针设置为 NULL。因此,处理指令导致 libxml2 尝试在某个随机地址调用函数,从而导致 EXC_BAD_ACCESS。

    我通过实现对在遇到处理指令时调用的可选委托方法的支持来解决 DTHTMLParser 中的问题,如果在委托中未实现,则在处理程序结构中调用 NULL。

    【讨论】:

    【解决方案2】:

    我认为 LibXML 错误地将其视为具有几乎相同语法的 处理指令。 Libxml 将其中包含&lt;? 的每一行视为处理指令。虽然我不能完全确定到底出了什么问题。如果您删除问号,它将作为常规元素解析,您将在parser:didStartElement:attributes: 回调方法中获取属性。如果您在问号和 xml (&lt;? xml) 之间放置一个空格,它将在 parser:foundCharacters 方法中返回。我不知道你的要求是什么,但这是让它不崩溃的两种方法。

    【讨论】:

    • 很有趣,但这意味着您需要对 HTML 进行两次传递:一次简单地检查任何看起来像处理指令的内容(因为如果您是对的,HTML 中的任何位置的处理指令可能导致此崩溃),然后第二个实际执行 HTML 解析。至少它似乎确认这是 libxml2 中的一个错误。
    • 看起来确实是这样。这很奇怪,因为 libxml 首先是一个 XML 解析器,处理指令与 HTML 无关,但与 XML 相关。但是,&lt;? 和任何 a-zA-Z 字符的组合似乎都会崩溃。数字和符号工作正常(我注意到 libXML 源在解析处理指令时经常进行 IS_CHAR 检查)。
    猜你喜欢
    • 2011-05-08
    • 2011-10-05
    • 2013-04-17
    • 1970-01-01
    • 1970-01-01
    • 2015-04-15
    • 2012-04-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多