免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5380 | 回复: 7
打印 上一主题 下一主题

[C] linux 下 strcmp遇到空字段直接core了 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-02-18 14:15 |只看该作者 |倒序浏览
1、先说下我的机器吧

uname -a
Linux demo 2.4.21-50.EL #1 SMP Tue May 8 17:10:00 EDT 2007 x86_64 x86_64 x86_64 GNU/Linux

2、程序demo
#include <stdio.h>
#include <string.h>
main(int argc, char *argv[])
{
        if(strcmp(argv[2], argv[1]))
        {
                printf("eeeeeeeeeeeeeeeeeeeeee\n";
                return -1;
        }
        printf("nnnnnnnnnnnnnnnnnnnnnnnnnn\n";
        return 0;
}
3、运行程序
./a.out 1
Segmentation fault (core dumped)
4、查看core
gdb a.out core.2086
GNU gdb Red Hat Linux (6.3.0.0-1.138.el3rh)
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "x86_64-redhat-linux-gnu"...Using host libthread_db library "/lib64/tls/libthread_db.so.1".

Core was generated by `./a.out 1'.
Program terminated with signal 11, Segmentation fault.
Reading symbols from /lib64/tls/libc.so.6...done.
Loaded symbols for /lib64/tls/libc.so.6
Reading symbols from /lib64/ld-linux-x86-64.so.2...done.
Loaded symbols for /lib64/ld-linux-x86-64.so.2
#0  0x0000002a9570af70 in strcmp () from /lib64/tls/libc.so.6
(gdb) where
#0  0x0000002a9570af70 in strcmp () from /lib64/tls/libc.so.6
#1  0x00000000004004fe in main (argc=2, argv=0x7fbfffa77 at 101.c:5
5、但是这个问题在unix上,或者说在AIX上没问题,请问大家该如何处理,谢谢了

论坛徽章:
12
巳蛇
日期:2013-09-16 15:32:242015年辞旧岁徽章
日期:2015-03-03 16:54:152015年亚洲杯之约旦
日期:2015-02-11 14:38:37双鱼座
日期:2015-01-05 11:05:47戌狗
日期:2014-12-08 09:41:18戌狗
日期:2014-08-15 09:29:29双子座
日期:2014-08-05 09:17:17卯兔
日期:2014-06-08 15:32:18巳蛇
日期:2014-01-27 08:47:08白羊座
日期:2013-11-28 21:04:15巨蟹座
日期:2013-11-13 21:58:012015年亚洲杯之科威特
日期:2015-04-17 16:51:51
2 [报告]
发表于 2014-02-18 14:24 |只看该作者
本帖最后由 zhaohongjian000 于 2014-02-18 14:45 编辑

这个访问数组(argv)越界了,跟strcmp没有关系。

搞错了,argv最后一个元素之后是一个NULL指针,把NULL指针传递给strcmp产生段错误非常正常。

论坛徽章:
0
3 [报告]
发表于 2014-02-18 14:53 |只看该作者
回复 2# zhaohongjian000

这个跟越界真没有关系,core信息已经写了strcmp问题了,
还有我在应用程序中确实出现了这样的问题
printf("VarName, svar->VarName =[%s, %s]\n",  svar->VarName,VarName);
                if ( strcmp (svar->VarName ,VarName) == 0 )  break;
下面就是程序运行出现的问题
VarName, svar->VarName =[(null), myname000000]
Segmentation fault (core dumped)
   

论坛徽章:
0
4 [报告]
发表于 2014-02-18 15:01 |只看该作者
回复 2# zhaohongjian000


    可是为啥unix却是可以的了?

论坛徽章:
12
巳蛇
日期:2013-09-16 15:32:242015年辞旧岁徽章
日期:2015-03-03 16:54:152015年亚洲杯之约旦
日期:2015-02-11 14:38:37双鱼座
日期:2015-01-05 11:05:47戌狗
日期:2014-12-08 09:41:18戌狗
日期:2014-08-15 09:29:29双子座
日期:2014-08-05 09:17:17卯兔
日期:2014-06-08 15:32:18巳蛇
日期:2014-01-27 08:47:08白羊座
日期:2013-11-28 21:04:15巨蟹座
日期:2013-11-13 21:58:012015年亚洲杯之科威特
日期:2015-04-17 16:51:51
5 [报告]
发表于 2014-02-18 15:06 |只看该作者
回复 4# taotao_112206_c


    编译器、操作系统、库等一般只保证正确的代码得到正确的结果,不保证错误的代码得到错误的结果。

论坛徽章:
26
处女座
日期:2016-04-18 14:00:4515-16赛季CBA联赛之深圳
日期:2020-06-02 10:10:5015-16赛季CBA联赛之广夏
日期:2019-07-23 16:59:452016科比退役纪念章
日期:2019-06-26 16:59:1315-16赛季CBA联赛之天津
日期:2019-05-28 14:25:1915-16赛季CBA联赛之青岛
日期:2019-05-16 10:14:082016科比退役纪念章
日期:2019-01-11 14:44:062016科比退役纪念章
日期:2018-07-18 16:17:4015-16赛季CBA联赛之上海
日期:2017-08-22 18:18:5515-16赛季CBA联赛之江苏
日期:2017-08-04 17:00:4715-16赛季CBA联赛之佛山
日期:2017-02-20 18:21:1315-16赛季CBA联赛之天津
日期:2016-12-12 10:44:23
6 [报告]
发表于 2014-02-19 16:46 |只看该作者
有些系统库的字符串操作函数会判断NULL 有些不会 不过直接core是正确的 只是这种方式很极端 不如JAVA的异常

论坛徽章:
0
7 [报告]
发表于 2014-03-11 16:03 |只看该作者
大家好,之前有事情,就把这个事情给撂下了,最近搞别的东西的时候又想起这个,这个问题一直没解决,我加了断言,可还是有些问题      
for (; svar; svar = svar->next )
        {
                printf("VarName, svar->VarName =[%s, %s]\n",  svar->VarName,VarName);
                assert( svar->VarName == NULL);
                if ( strcmp (VarName ,svar->VarName) == 0 )  break;
        }
VarName, svar->VarName =[ok, ok]
test: DataPoolApi.c:362: GetVariableFromDataPool: Assertion `svar->VarName == ((void *)0)' failed.
Aborted (core dumped),我在想是不是可以在这个之前就判断这个参数是不是为空的

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
8 [报告]
发表于 2014-03-11 17:05 |只看该作者
taotao_112206_c 发表于 2014-03-11 16:03
大家好,之前有事情,就把这个事情给撂下了,最近搞别的东西的时候又想起这个,这个问题一直没解决,我加了 ...


你要不为空,应该
assert( svar->VarName != NULL);

实际可能为空,那就不应该用assert,用if判断才对
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP