免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: rain_fish
打印 上一主题 下一主题

指针初始化为空,相当重要 [复制链接]

论坛徽章:
0
51 [报告]
发表于 2010-11-13 09:55 |只看该作者
面对积累了n年的烂代码,想要短期内给搞好是不可能的。

因为再烂的代码,“起码它还能跑!”

但因为老 ...
狗气球 发表于 2010-11-13 09:44

防御式编程
说的准确!有些人就是喜欢这样。
确实应该多分析,而不是乱贴膏药。
基本功要扎扎实实的练,写程序要一招一式的夯实基础。
哪有那么多扯淡问题!
需要防御式编程才能搞定的,只能说明你的编程思想或习惯有严重缺陷!

论坛徽章:
0
52 [报告]
发表于 2010-11-13 10:01 |只看该作者
我们产品出过这种事儿:

某一次因为某个指针没有初始化,出了事故。
上级要求所有指针添加初始化。不问是global的、文件级static的还是函数里的自动变量。

然后组里就找了个新员工做这事儿。
他就逐行扫描地赋初值。

从那以后读代码就时不时的看到一些莫名其妙的初值。
尤其是函数局部变量。

论坛徽章:
0
53 [报告]
发表于 2010-11-13 10:45 |只看该作者
本帖最后由 guoruimin 于 2010-11-13 11:19 编辑
  1. #include <stdio.h>

  2. int main(int argc, char *argv[])
  3. {
  4.     char *msg;

  5.     if (1 == argc)
  6.         msg = "0 arg";
  7.     else if (2 == argc)
  8.         msg = "1 arg";
  9.     //else
  10.     //    msg = "too more arg";

  11.     printf("You input %s.\n", msg);

  12.     return 0;
  13. }
复制代码
gcc -O2 -Wuninitialized test.c
  1. test.c: In function ‘main’:
  2. test.c:5: warning: ‘msg’ may be used uninitialized in this function
复制代码
上垃圾代码
  1. #include <stdio.h>

  2. int main(int argc, char *argv[])
  3. {
  4.     char *msg = NULL;

  5.     if (1 == argc)
  6.         msg = "0 arg";
  7.     else if (2 == argc)
  8.         msg = "1 arg";
  9.     //else
  10.     //    msg = "too more arg";

  11.     printf("You input %s.\n", msg);

  12.     return 0;
  13. }
复制代码
gcc -O2 -Wuninitialized test.c
  1. 无错误提示
复制代码
./a.out 1 2
  1. You input (null).
复制代码
滥用初赋值,只会造成更大的隐患!
一些事情看似有道理,但如果不是反映客观现实所必须的,就会弄巧成拙。
许多事情,不是一眼就能看透,一拍脑袋就能想通的,所以人往往会被暂时的迷惑!
切记一点:一切行为,都要符合逻辑,反映客观现实,违背了这一点,必将弄巧成拙。
写程序当然也不例外!
程序的实现要反映客观现实,项目才不会被动,才不会要改来改去!

论坛徽章:
0
54 [报告]
发表于 2010-11-13 18:04 |只看该作者
gcc -O2 -Wuninitialized test.c上垃圾代码gcc -O2 -Wuninitialized test.c./a.out 1 2滥用初赋值,只会造成 ...
guoruimin 发表于 2010-11-13 10:45



例外永远找得到,装B永远有理由...

您那“不拉级”代码运行之后,结果是Undefined;而您眼中的“垃圾”代码结果是段错误崩溃。

你自己说:那个安全?尤其是对于一个还没认识到Warning重要性的初学者来说?!

别寄希望于你的coder们全是高手!即便是高手,写到凌晨3点也是只怂猫!

论坛徽章:
0
55 [报告]
发表于 2010-11-13 19:19 |只看该作者
gcc -O2 -Wuninitialized test.c上垃圾代码gcc -O2 -Wuninitialized test.c./a.out 1 2滥用初赋值,只会造成 ...
guoruimin 发表于 2010-11-13 10:45



    你这是典型的自己打自己脸。 按你的意思代码不应该依赖其本来的语义,反而要依赖编译器优化?
   char *s; 不初始化其内容就是未定义的。 这就是实事求是,也是最危险的。
    你把-O2去掉,看看打印的是什么东西? 比段错误差多了,因为它本来应该是个错误。
   把一个本来该出错的地方给了个无意义的结果更不可取。 人家输入的本来也不是所谓的(null)嘛,(null)是个什么东西?符合客观实话么?

论坛徽章:
0
56 [报告]
发表于 2010-11-14 09:25 |只看该作者
本帖最后由 guoruimin 于 2010-11-14 09:27 编辑
例外永远找得到,装B永远有理由...

您那“不拉级”代码运行之后,结果是Undefined;而您眼中的“垃 ...
JohnBull 发表于 2010-11-13 18:04

挺喜欢出言不逊哦!
自己挂一身名片,还老喜欢说别人装B。

  1. __________________________________
  2. 隐藏帖一概不回!
  3. -----------------------------
  4. Linux,X.org,GTK+,QT,GNOME,KDE,Android......
  5. 这几个东西谁是谁,干什么用的,谁和谁有关,谁和谁无关,你们都搞清楚了没?
  6. 可以咬,但是别咬错了!
  7. --------------------------------------------
  8. 政治立场坐标 0.8
  9. 文化立场坐标 0.8
  10. 经济立场坐标 0.2
复制代码

论坛徽章:
0
57 [报告]
发表于 2010-11-14 09:41 |只看该作者
本帖最后由 guoruimin 于 2010-11-14 09:57 编辑

平时写代码,发布windows版本时,是用VC编译的。
VC编译器:如果变量未赋值便使用,编译器会有警告的。
GCC编译器加上 -O -Wuninitialized 选项也会有警告。
这样有缺陷的代码,在编译阶段,就发现了。
根本到不了运行的那一步!
我的代码在编译时,是不允许有警告出现的。
同一段代码GCC、VC都不能有警告,这只是个人习惯。
利用编译器的这个特性,能在编译阶段就帮我发现问题。
这也是我不喜欢滥用初赋值的原因吧!
一旦在不适合的情况下,给指针赋上NULL,有可能这个错误到程序崩溃时才能发现。
如上我举的例子(53楼),崩溃只会在特定条件下发生,或许是发生在产品发布之后。

有一大堆警告的代码!在项目中,我是不敢采用的。
平时的要求是,一个警告都不能有。
否则你一个警告、我一个警告。。。
一编译一大堆问题,想找到刚出现的错误都很难。

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
58 [报告]
发表于 2010-11-14 09:52 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
59 [报告]
发表于 2010-11-14 09:54 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
60 [报告]
发表于 2010-11-14 09:56 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP