Я получаю странное segfault при использовании libxml для анализа файла. Этот код работал раньше, когда я скомпилировал его как 32-битное приложение. Я изменил его на 64-битное приложение, и оно перестало работать.
Ошибка seg возникает по адресу «if (xmlStrcmp (cur-> name, (const xmlChar *) «servers»))»
cur->name является константой xmlChar * и указывает на адрес, который говорит о его выходе за пределы. Но когда я отлаживаю и перехожу к этому месту памяти, эти данные верны.
int XmlGetServers()
{
xmlDocPtr doc;
xmlNodePtr cur;
doc = xmlParseFile("Pin.xml");
if (doc == NULL)
{
std::cout << "\n Pin.xml not parsed successfully." << std::endl;
return -1;
}
cur = xmlDocGetRootElement(doc);
if (cur == NULL)
{
std::cout << "\n Pin.xml is empty document." << std::endl;
xmlFreeDoc(doc);
return -1;
}
if (xmlStrcmp(cur->name, (const xmlChar *) "servers"))
{
std::cout << "\n ERROR: Pin.xml of the wrong type, root node != servers." << std::endl;
xmlFreeDoc(doc);
return -1;
}
}
Перед инициализацией cur параметр имени
Name : name
Details:0xed11f72000007fff <Address 0xed11f72000007fff out of bounds>
После инициализации cur параметр имени
Name : name
Details:0x64c43000000000 <Address 0x64c43000000000 out of bounds>
Ссылочный XML-файл
<?xml version="1.0"?>
<servers>
<server_info>
<server_name>Server1</server_name>
<server_ip>127.0.0.1</server_ip>
<server_data_port>9000</server_data_port>
</server_info>
<server_info>
<server_name>Server2</server_name>
<server_ip>127.0.0.1</server_ip>
<server_data_port>9001</server_data_port>
</server_info>
</servers>
Система:
ОС: Redhat Enterprise Linux 6.4 64-битная
ССЗ: 4.4.7-3
пакеты: libxml2-2.7.6-8.el6_3.4.x86_64