免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2980 | 回复: 10

[C] 反复测试,发现printf的诡异问题 [复制链接]

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 10:16:53
发表于 2015-10-06 21:24 |显示全部楼层
回复 3# yulihua49


    就是int类型,domain是char *类型,我觉得实在奇怪,gdb调试了没用,没什么逻辑错误,只要注释掉printf这句就没问题。

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
发表于 2015-10-06 21:36 |显示全部楼层
像类似这种诡异的问题,例如:

1. 在一个编译器下正常,另外一个编译器就不行(并没有使用编译器扩展);
2. 同一编译器,换了版本就不正常了;
3. 同一编译器,加优化选项就正常了;
4. 加个打印或者其他不应该影响程序行为的语句,就正常了;
。。。

这种种诡异的bug,调到最后,90%(甚至99%)都是代码写的有问题,要么是有未定义行为,要么是有编译器定义行为,要么代码导致了 memory corruption; 而 printf 会影响程序行为,就是 stack corruption 的直接征兆。

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
发表于 2015-10-07 08:44 |显示全部楼层
回复 5# MMMIX


    Agree, Printf躺枪

论坛徽章:
1
综合交流区版块每日发帖之星
日期:2015-10-14 06:20:00
发表于 2015-10-07 09:35 |显示全部楼层
导致指针指向的内存数据混乱
------------------------------
到底是什么指针指向的内存怎么混乱法?  你应该把完整的程序贴出来,让大伙检验是不是真的出现问题。

论坛徽章:
1
2015亚冠之阿尔艾因
日期:2015-08-24 15:46:57
发表于 2015-10-08 09:32 |显示全部楼层
printf不会有问题吧,应该是你程序其它地方影响了

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
发表于 2015-10-08 10:32 |显示全部楼层
本帖最后由 yulihua49 于 2015-10-08 10:34 编辑
thy_shenzhen 发表于 2015-10-05 21:37
代码如下:这段代码只要用到了printf而且打出3个变量的就会影响到其他程序,导致指针指向的内存数据混乱。
...

<sdbc@~/log> vi t.c
#include <stdio.h>
#include <string.h>

int main(int argc,char *argv[])
{
char * domain1         = "blog";
char * domain2         = "chinaunix";
char * domain3         = "net";
int len1,len2,len3;

        len1 = strlen(domain1);
        len2 = strlen(domain2);
        len3 = strlen(domain3);
      printf("the str len1 len2 len3 is %d,%d,%d====\n",len1,len2,len3);
        return 0;
}


        .size   main, .-main
        .ident  "GCC: (GNU) 4.4.6 20120305 (Red Hat 4.4.6-4)"
        .section        .note.GNU-stack,"",@progbits

~
~
~
~
~
~
~
~
~
~
~
"t.c" 16L, 386C 已写入                                                                                 
<sdbc@~/log> cc t.c
<sdbc@~/log> ./a.out
the str len1 len2 len3 is 4,9,3====

论坛徽章:
4
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11IT运维版块每日发帖之星
日期:2016-08-11 06:20:00IT运维版块每日发帖之星
日期:2016-08-15 06:20:00
发表于 2015-10-10 09:29 |显示全部楼层
应该是程序其他地方存在问题,只是通过printf触发了而已。

论坛徽章:
11
2015年迎新春徽章
日期:2015-03-04 09:55:282017金鸡报晓
日期:2017-02-08 10:39:4215-16赛季CBA联赛之辽宁
日期:2016-12-15 10:24:1715-16赛季CBA联赛之佛山
日期:2016-11-30 09:04:2015-16赛季CBA联赛之江苏
日期:2016-04-29 15:56:1215-16赛季CBA联赛之同曦
日期:2016-04-12 13:21:182016猴年福章徽章
日期:2016-02-18 15:30:3415-16赛季CBA联赛之山东
日期:2016-02-16 11:37:52每日论坛发贴之星
日期:2016-02-07 06:20:00程序设计版块每日发帖之星
日期:2016-02-07 06:20:0015-16赛季CBA联赛之新疆
日期:2018-01-09 16:25:37
发表于 2015-10-10 12:28 |显示全部楼层
同意,应该是其他地方引发的.........
我也类似的,一个线程访问了一个变量,就core了,而另外一个线程无论怎么访问都没有问题...
昏天糊地搞了几个月...才发现其中一个线程启动了新线程退出时释放错误,影响了另外线程的地址空间

论坛徽章:
0
发表于 2015-10-10 13:31 |显示全部楼层
上面给出的代码看不出来问题.再次确认下len{1,2,3}的类型是否是int.
建议用gdb去调试下.

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 10:16:53
发表于 2015-10-13 12:51 |显示全部楼层
回复 2# MMMIX




----------------------------------------------------------

问题是这种问题似乎比较难查,编译和执行几乎没什么提示报错。可能跟printf的原理有关吧,要看下printf的源码。
   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP