大家见过这个错误吗,这是是原因啊,怎么解决?

布鲁克斯南南 2013-03-22 09:08:37
*** stack smashing detected ***: ./parsexml terminated
======= Backtrace: =========
/lib/tls/i686/cmov/libc.so.6(__fortify_fail+0x50)[0xd23390]
/lib/tls/i686/cmov/libc.so.6(+0xe233a)[0xd2333a]
./parsexml[0x8048c22]
/lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xe6)[0xc57bd6]
./parsexml[0x8048791]
======= Memory map: ========
00110000-00120000 r-xp 00000000 08:01 1710561 /usr/lib/gconv/libGB.so
00120000-00121000 r--p 0000f000 08:01 1710561 /usr/lib/gconv/libGB.so
00121000-00122000 rw-p 00010000 08:01 1710561 /usr/lib/gconv/libGB.so
0012c000-0012d000 r-xp 00000000 00:00 0 [vdso]
001fa000-00215000 r-xp 00000000 08:01 524313 /lib/ld-2.11.1.so
00215000-00216000 r--p 0001a000 08:01 524313 /lib/ld-2.11.1.so
00216000-00217000 rw-p 0001b000 08:01 524313 /lib/ld-2.11.1.so
002e8000-0030c000 r-xp 00000000 08:01 656185 /lib/tls/i686/cmov/libm-2.11.1.so
0030c000-0030d000 r--p 00023000 08:01 656185 /lib/tls/i686/cmov/libm-2.11.1.so
0030d000-0030e000 rw-p 00024000 08:01 656185 /lib/tls/i686/cmov/libm-2.11.1.so
0036c000-00455000 r-xp 00000000 08:01 1718725 /usr/lib/libstdc++.so.6.0.13
00455000-00459000 r--p 000e9000 08:01 1718725 /usr/lib/libstdc++.so.6.0.13
00459000-0045a000 rw-p 000ed000 08:01 1718725 /usr/lib/libstdc++.so.6.0.13
0045a000-00461000 rw-p 00000000 00:00 0
0056c000-0056f000 r-xp 00000000 08:01 1710357 /usr/lib/gconv/EUC-CN.so
0056f000-00570000 r--p 00002000 08:01 1710357 /usr/lib/gconv/EUC-CN.so
00570000-00571000 rw-p 00003000 08:01 1710357 /usr/lib/gconv/EUC-CN.so
0084e000-00972000 r-xp 00000000 08:01 1704368 /usr/lib/libxml2.so.2.7.6
00972000-00973000 ---p 00124000 08:01 1704368 /usr/lib/libxml2.so.2.7.6
00973000-00977000 r--p 00124000 08:01 1704368 /usr/lib/libxml2.so.2.7.6
00977000-00978000 rw-p 00128000 08:01 1704368 /usr/lib/libxml2.so.2.7.6
00978000-00979000 rw-p 00000000 00:00 0
009f2000-009f4000 r-xp 00000000 08:01 656183 /lib/tls/i686/cmov/libdl-2.11.1.so
009f4000-009f5000 r--p 00001000 08:01 656183 /lib/tls/i686/cmov/libdl-2.11.1.so
009f5000-009f6000 rw-p 00002000 08:01 656183 /lib/tls/i686/cmov/libdl-2.11.1.so
00c28000-00c3b000 r-xp 00000000 08:01 524486 /lib/libz.so.1.2.3.3
00c3b000-00c3c000 r--p 00012000 08:01 524486 /lib/libz.so.1.2.3.3
00c3c000-00c3d000 rw-p 00013000 08:01 524486 /lib/libz.so.1.2.3.3
00c41000-00d94000 r-xp 00000000 08:01 656177 /lib/tls/i686/cmov/libc-2.11.1.so
00d94000-00d95000 ---p 00153000 08:01 656177 /lib/tls/i686/cmov/libc-2.11.1.so
00d95000-00d97000 r--p 00153000 08:01 656177 /lib/tls/i686/cmov/libc-2.11.1.so
00d97000-00d98000 rw-p 00155000 08:01 656177 /lib/tls/i686/cmov/libc-2.11.1.so
00d98000-00d9b000 rw-p 00000000 00:00 0
00ef2000-00f0f000 r-xp 00000000 08:01 524530 /lib/libgcc_s.so.1
00f0f000-00f10000 r--p 0001c000 08:01 524530 /lib/libgcc_s.so.1get attribute abort



我主要做的事是在解析xml配置文件,这里需要用到的是libxml2库,C语言编写的库
...全文
241 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
布鲁克斯南南 2013-03-25
  • 打赏
  • 举报
回复
引用 1 楼 mymtom 的回复:
*** stack smashing detected ==== 越界写,破坏了栈了。
请版主给我看一下 我贴了源码
布鲁克斯南南 2013-03-25
  • 打赏
  • 举报
回复
引用 3 楼 prohibit 的回复:
越界访问内存了,使用指针的时候得注意
请帮我看一下 问题所在,我贴了源码
布鲁克斯南南 2013-03-25
  • 打赏
  • 举报
回复
引用 2 楼 nostopstep 的回复:
又是prasexml,你是下载的吧,这个解析文件写的不是特别好,少了一些合法性检测。因此,你使用的时候要小心,上的错误,就是你使用不当,造成越界或者空指针。
自己照着网上资料写的,大神帮我看一下,代码
#include <stdio.h>
#include <stdlib.h>
#include <libxml/parser.h>
#include <libxml/xmlmemory.h>
#include<libxml/tree.h>
/********************************************************************

    created:   2013/3/21

    created:    15:34

    filename: CreateXmlFile.c

    author:       LL

    depend:       libxml2.lib

    build:     CODEBLOCKS

    purpose:   创建一个xml文件

*********************************************************************/

int main()
{

  xmlDocPtr doc;           //定义解析文档指针

    xmlNodePtr curNode,curNode1;      //定义结点指针(你需要它为了在各个结点间移动)

    xmlChar *szKey;          //临时字符串变量

    char *szDocName;


    szDocName = "CreatedXml.xml";

    doc = xmlReadFile(szDocName,"GB2312",XML_PARSE_RECOVER); //解析文件

    //检查解析文档是否成功,如果不成功,libxml将指一个注册的错误并停止。

    //一个常见错误是不适当的编码。XML标准文档除了用UTF-8或UTF-16外还可用其它编码保存。

    //如果文档是这样,libxml将自动地为你转换到UTF-8。更多关于XML编码信息包含在XML标准中.

    if (NULL == doc)

    {

       fprintf(stderr,"Document not parsed successfully.\n");

       return -1;

    }

    curNode = xmlDocGetRootElement(doc); //确定文档根元素

    /*检查确认当前文档中包含内容*/

    if (NULL == curNode)

    {

       fprintf(stderr,"empty document\n");

       xmlFreeDoc(doc);

       return -1;

    }

    /*在这个例子中,我们需要确认文档是正确的类型。“root”是在这个示例中使用文档的根类型。*/

    if (xmlStrcmp(curNode->name, BAD_CAST "root"))

    {

       fprintf(stderr,"document of the wrong type, root node != root");

       xmlFreeDoc(doc);

       return -1;

    }

    curNode = curNode->xmlChildrenNode;

    xmlNodePtr propNodePtr = curNode;
    int i=0;

    while(curNode != NULL)

    {

       //取出节点中的内容

       if ((!xmlStrcmp(curNode->name, (const xmlChar *)"ServerIP")))

       {

           szKey = xmlNodeGetContent(curNode);

           printf("ServerIP: %s\n", szKey);

           xmlFree(szKey);

       }
       if ((!xmlStrcmp(curNode->name, (const xmlChar *)"CollectorID")))

       {

           szKey = xmlNodeGetContent(curNode);

           printf("CollectorID: %s\n", szKey);

           xmlFree(szKey);

       }
     if ((!xmlStrcmp(curNode->name, (const xmlChar *)"Circle")))

       {

           szKey = xmlNodeGetContent(curNode);

           printf("Circle: %s\n", szKey);

           xmlFree(szKey);


       }
        char UserID[10];
        sprintf(UserID,"UserInfo--%d",i);

       if ((!xmlStrcmp(curNode->name, (const xmlChar *)UserID)))

       {
           curNode1 = curNode->xmlChildrenNode;
            if ((!xmlStrcmp(curNode1->name, (const xmlChar *)"ValveControllerID")))

           {
               szKey = xmlNodeGetContent(curNode1);

             printf("ValveControllerID: %s\n", szKey);
             xmlFree(szKey);
          //删除一个节点
         /* xmlNodePtr tempNode;

          tempNode = curNode1->next;

           xmlUnlinkNode(curNode1);

           xmlFreeNode(curNode1);

           curNode->xmlChildrenNode = tempNode;

          // continue;

          }*/
           curNode1 = curNode1->next;
          if ((!xmlStrcmp(curNode1->name, (const xmlChar *)"HouseArea")))

          { szKey = xmlNodeGetContent(curNode1);

           printf("HouseArea %s\n", szKey);

           xmlFree(szKey);
           i++;
           }

       }

    }
       //查找带有属性attribute的节点

       if (xmlHasProp(curNode,BAD_CAST "Type"))

       {

           propNodePtr = curNode;

       }

       curNode = curNode->next;

    }

    //查找属性

    xmlAttrPtr attrPtr = propNodePtr->properties;

    while (attrPtr != NULL)

    {

       if (!xmlStrcmp(attrPtr->name, BAD_CAST "Type"))

       {

           xmlChar* szAttr = xmlGetProp(propNodePtr,BAD_CAST "Type");

           printf("get attribute = %s",szAttr);

           xmlFree(szAttr);

       }

       attrPtr = attrPtr->next;

    }

    xmlFreeDoc(doc);

    return 0;

}

<?xml version="1.0"?>
-<root><ServerIP>172.16.24.214</ServerIP><CollectorID>10-1-12</CollectorID><Circle>2</Circle><HeatMeterAddressID Type="hex">A0A1A2A3A4A5A6A7</HeatMeterAddressID>-<UserInfo--0><ValveControllerID>01020304050607</ValveControllerID><HouseArea>00.0</HouseArea></UserInfo--0>-<UserInfo--1><ValveControllerID>01020304050607</ValveControllerID><HouseArea>00.0</HouseArea></UserInfo--1>-<UserInfo--2><ValveControllerID>01020304050607</ValveControllerID><HouseArea>00.0</HouseArea></UserInfo--2>-<UserInfo--3><ValveControllerID>01020304050607</ValveControllerID><HouseArea>00.0</HouseArea></UserInfo--3>-<UserInfo--4><ValveControllerID>01020304050607</ValveControllerID><HouseArea>00.0</HouseArea></UserInfo--4>-<UserInfo--5><ValveControllerID>01020304050607</ValveControllerID><HouseArea>00.0</HouseArea></UserInfo--5>-<UserInfo--6><ValveControllerID>01020304050607</ValveControllerID><HouseArea>00.0</HouseArea></UserInfo--6>-<UserInfo--7><ValveControllerID>01020304050607</ValveControllerID><HouseArea>00.0</HouseArea></UserInfo--7>-<UserInfo--8><ValveControllerID>01020304050607</ValveControllerID><HouseArea>00.0</HouseArea></UserInfo--8>-<UserInfo--9><ValveControllerID>01020304050607</ValveControllerID><HouseArea>00.0</HouseArea></UserInfo--9>-<UserInfo--10><ValveControllerID>01020304050607</ValveControllerID><HouseArea>00.0</HouseArea></UserInfo--10>-<UserInfo--11><ValveControllerID>01020304050607</ValveControllerID><HouseArea>00.0</HouseArea></UserInfo--11>-<UserInfo--12><ValveControllerID>01020304050607</ValveControllerID><HouseArea>00.0</HouseArea></UserInfo--12>-<UserInfo--13><ValveControllerID>01020304050607</ValveControllerID><HouseArea>00.0</HouseArea></UserInfo--13>-<UserInfo--14><ValveControllerID>01020304050607</ValveControllerID><HouseArea>00.0</HouseArea></UserInfo--14>-<UserInfo--15><ValveControllerID>01020304050607</ValveControllerID><HouseArea>00.0</HouseArea></UserInfo--15>-<UserInfo--16><ValveControllerID>01020304050607</ValveControllerID><HouseArea>00.0</HouseArea></UserInfo--16>-<UserInfo--17><ValveControllerID>01020304050607</ValveControllerID><HouseArea>00.0</HouseArea></UserInfo--17>-<UserInfo--18><ValveControllerID>01020304050607</ValveControllerID><HouseArea>00.0</HouseArea></UserInfo--18>-<UserInfo--19><ValveControllerID>01020304050607</ValveControllerID><HouseArea>00.0</HouseArea></UserInfo--19>-<UserInfo--20><ValveControllerID>01020304050607</ValveControllerID><HouseArea>00.0</HouseArea></UserInfo--20>-<UserInfo--21><ValveControllerID>01020304050607</ValveControllerID><HouseArea>00.0</HouseArea></UserInfo--21>-<UserInfo--22><ValveControllerID>01020304050607</ValveControllerID><HouseArea>00.0</HouseArea></UserInfo--22>-<UserInfo--23><ValveControllerID>01020304050607</ValveControllerID><HouseArea>00.0</HouseArea></UserInfo--23>-<UserInfo--24><ValveControllerID>01020304050607</ValveControllerID><HouseArea>00.0</HouseArea></UserInfo--24>-<UserInfo--25><ValveControllerID>01020304050607</ValveControllerID><HouseArea>00.0</HouseArea></UserInfo--25>-<UserInfo--26><ValveControllerID>01020304050607</ValveControllerID><HouseArea>00.0</HouseArea></UserInfo--26>-<UserInfo--27><ValveControllerID>01020304050607</ValveControllerID><HouseArea>00.0</HouseArea></UserInfo--27>-<UserInfo--28><ValveControllerID>01020304050607</ValveControllerID><HouseArea>00.0</HouseArea></UserInfo--28>-<UserInfo--29><ValveControllerID>01020304050607</ValveControllerID><HouseArea>00.0</HouseArea></UserInfo--29>-<UserInfo--30><ValveControllerID>01020304050607</ValveControllerID><HouseArea>00.0</HouseArea></UserInfo--30>-<UserInfo--31><ValveControllerID>01020304050607</ValveControllerID><HouseArea>00.0</HouseArea></UserInfo--31>-<UserInfo--32><ValveControllerID>01020304050607</ValveControllerID><HouseArea>00.0</HouseArea></UserInfo--32>-<UserInfo--33><ValveControllerID>01020304050607</ValveControllerID><HouseArea>00.0</HouseArea></UserInfo--33>-<UserInfo--34><ValveControllerID>01020304050607</ValveControllerID><HouseArea>00.0</HouseArea></UserInfo--34>-<UserInfo--35><ValveControllerID>01020304050607</ValveControllerID><HouseArea>00.0</HouseArea></UserInfo--35>-<UserInfo--36><ValveControllerID>01020304050607</ValveControllerID><HouseArea>00.0</HouseArea></UserInfo--36>-<UserInfo--37><ValveControllerID>01020304050607</ValveControllerID><HouseArea>00.0</HouseArea></UserInfo--37>-<UserInfo--38><ValveControllerID>01020304050607</ValveControllerID><HouseArea>00.0</HouseArea></UserInfo--38>-<UserInfo--39><ValveControllerID>01020304050607</ValveControllerID><HouseArea>00.0</HouseArea></UserInfo--39>-<UserInfo-0</HouseArea></UserInfo--44>-<UserInfo--45><ValveControllollelveControllerID>
。 。 。 。 。 。 
xml文件太大了, 上面只是一部分
nostopstep 2013-03-25
  • 打赏
  • 举报
回复
引用 8 楼 li875590079 的回复:
引用 7 楼 mymtom 的回复:131行 C/C++ code?12 char UserID[10]; sprintf(UserID,"UserInfo--%d",i); char UserID[10]; // 才10个字节,太小了"UserInfo--"都超过了 改为 char UserID[100]; ……
C和C++中,对于数组越界的问题,基本都不报错,而是给出警告,你肯定是忽略了敬告导致。对于自己编译时产生的警告,最好尽可能的更改。或者将警告当错误来处理。
布鲁克斯南南 2013-03-25
  • 打赏
  • 举报
回复
引用 7 楼 mymtom 的回复:
131行 C/C++ code?12 char UserID[10]; sprintf(UserID,"UserInfo--%d",i); char UserID[10]; // 才10个字节,太小了"UserInfo--"都超过了 改为 char UserID[100];
大意了 哎 没注意到啊,这个怎么编译器在编译时 不报错???
mymtom 2013-03-25
  • 打赏
  • 举报
回复
131行

         char UserID[10];
         sprintf(UserID,"UserInfo--%d",i);
char UserID[10]; // 才10个字节,太小了"UserInfo--"都超过了 改为 char UserID[100];
prohibit 2013-03-22
  • 打赏
  • 举报
回复
越界访问内存了,使用指针的时候得注意
mymtom 2013-03-22
  • 打赏
  • 举报
回复
*** stack smashing detected ==== 越界写,破坏了栈了。
nostopstep 2013-03-22
  • 打赏
  • 举报
回复
又是prasexml,你是下载的吧,这个解析文件写的不是特别好,少了一些合法性检测。因此,你使用的时候要小心,上的错误,就是你使用不当,造成越界或者空指针。

23,125

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧