免费注册 查看新帖 |

Chinaunix

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

[C] 关于UB的问题 [复制链接]

论坛徽章:
19
CU大牛徽章
日期:2013-03-13 15:32:35CU大牛徽章
日期:2013-09-18 15:15:15CU大牛徽章
日期:2013-05-20 10:46:44CU大牛徽章
日期:2013-05-20 10:46:38CU大牛徽章
日期:2013-05-20 10:46:31CU大牛徽章
日期:2013-05-20 10:46:25CU大牛徽章
日期:2013-05-20 10:46:18CU大牛徽章
日期:2013-04-17 11:19:51CU大牛徽章
日期:2013-04-17 11:19:42CU大牛徽章
日期:2013-04-17 11:19:37CU大牛徽章
日期:2013-04-17 11:19:32CU大牛徽章
日期:2013-04-17 11:19:28
21 [报告]
发表于 2013-01-14 23:35 |只看该作者
回复 20# starwing83

额,就是要过滤错误输入的意思呗
   

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
22 [报告]
发表于 2013-01-14 23:47 |只看该作者
回复 21# 方兆国


    只要文档里面写出即可,犯不着过滤。

只是说明一个编程的理念罢了,先划清范围再慢慢蚕食,而不是一上来就咋地咋地。

论坛徽章:
19
CU大牛徽章
日期:2013-03-13 15:32:35CU大牛徽章
日期:2013-09-18 15:15:15CU大牛徽章
日期:2013-05-20 10:46:44CU大牛徽章
日期:2013-05-20 10:46:38CU大牛徽章
日期:2013-05-20 10:46:31CU大牛徽章
日期:2013-05-20 10:46:25CU大牛徽章
日期:2013-05-20 10:46:18CU大牛徽章
日期:2013-04-17 11:19:51CU大牛徽章
日期:2013-04-17 11:19:42CU大牛徽章
日期:2013-04-17 11:19:37CU大牛徽章
日期:2013-04-17 11:19:32CU大牛徽章
日期:2013-04-17 11:19:28
23 [报告]
发表于 2013-01-15 00:00 |只看该作者
回复 22# starwing83


    这样啊,我还以为多复杂呢,谢谢你~\(≧▽≦)/~

论坛徽章:
0
24 [报告]
发表于 2013-01-15 09:45 |只看该作者
UB就是说:
标准 委员会也不知道到底结果是什么,因为他们是标准委员会,而不是编译器,编译器想怎么实现就怎么实现,当然一般如果实现起来还是有点靠谱的想法的,但这样就会造成一个问题,你的代码给别人玩的时侯就会出现问题,别人可不会管你什么UB,只会认为你的代码有问题。

所以,如果只是自己偷偷玩,且知道编译器是怎么处理的,你完全可以使用UB,但是像做工程,或者开源一个玩意,最好避免他,当然你能确定所有的编译器都同样处理这个UB另说,但你不能保证最新的编译器会以同样的方式来处理它。

论坛徽章:
19
CU大牛徽章
日期:2013-03-13 15:32:35CU大牛徽章
日期:2013-09-18 15:15:15CU大牛徽章
日期:2013-05-20 10:46:44CU大牛徽章
日期:2013-05-20 10:46:38CU大牛徽章
日期:2013-05-20 10:46:31CU大牛徽章
日期:2013-05-20 10:46:25CU大牛徽章
日期:2013-05-20 10:46:18CU大牛徽章
日期:2013-04-17 11:19:51CU大牛徽章
日期:2013-04-17 11:19:42CU大牛徽章
日期:2013-04-17 11:19:37CU大牛徽章
日期:2013-04-17 11:19:32CU大牛徽章
日期:2013-04-17 11:19:28
25 [报告]
发表于 2013-01-15 10:00 |只看该作者
回复 24# _Rayx


    额,就是像楼上所说的那样,对可能出错的地方都进行判断,是不是这个意思啊
    话说判断太多,程序的效率会下降

论坛徽章:
2
亥猪
日期:2014-03-19 16:36:35午马
日期:2014-11-23 23:48:46
26 [报告]
发表于 2013-01-15 10:23 |只看该作者
  1. C_standard {
  2.     abstract impl_operations;
  3.    
  4.     standard_operations{};
  5. }
  6. Gcc :: C_standard {
  7.     impl_operations {};
  8.     other_operations_gcc{};
  9. }
  10. LLVM::C_standard {
  11.     impl_operations {};
  12.     other_operations_llvm{};
  13. }
复制代码
standard_operations是标准明确定义的行为。
abstract impl_operations是标准未明确定义的行为,或者提出几种选择,该行为是编译器实现相关,怎么实现都认为是正确的,并且符合标准。
other_operations_xxx是标准未明确定义的行为,该行为可以是编译器根据自己的设计予以实现,也可以是编译器报异常报错误,也可以是运行期异常,怎么实现都认为是非正确的。虽然other_operations_xxx可以有计算结果,虽然这种计算遵循最小惊讶原则,只是通常这样的结果被认为是编译器对新手的照顾。用C的最大难点是:你需要明白你在做什么,并且需要知道怎么做,除此之外还需要知道谁在做。
上门伪代码中子类实现的东西通常不具备移植性。

论坛徽章:
19
CU大牛徽章
日期:2013-03-13 15:32:35CU大牛徽章
日期:2013-09-18 15:15:15CU大牛徽章
日期:2013-05-20 10:46:44CU大牛徽章
日期:2013-05-20 10:46:38CU大牛徽章
日期:2013-05-20 10:46:31CU大牛徽章
日期:2013-05-20 10:46:25CU大牛徽章
日期:2013-05-20 10:46:18CU大牛徽章
日期:2013-04-17 11:19:51CU大牛徽章
日期:2013-04-17 11:19:42CU大牛徽章
日期:2013-04-17 11:19:37CU大牛徽章
日期:2013-04-17 11:19:32CU大牛徽章
日期:2013-04-17 11:19:28
27 [报告]
发表于 2013-01-15 10:26 |只看该作者
回复 26# gvim


    恩,我也看到了,就是说要做可移植的代码,就不能有UB,或者说代码里有的话,使用手册里有说明就可以了,不考虑可移植,就可以有,是不

论坛徽章:
2
亥猪
日期:2014-03-19 16:36:35午马
日期:2014-11-23 23:48:46
28 [报告]
发表于 2013-01-15 10:30 |只看该作者
本帖最后由 gvim 于 2013-01-15 10:33 编辑

回复 27# 方兆国

不光是移植问题,运行期的不确定性也会导致问题。
所以解决办法是1:避免不确定,比如a+=a-=a*a,2:缩小范围把不确定变成确定,比如assert(),3:如果必须存在不确定的东西,在文档里红色注明可能产生的条件和可能的影响,在系统层面配合不触发某些条件。(或许碰到这点更应该改的是你的设计了)

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
29 [报告]
发表于 2013-01-15 11:28 |只看该作者

论坛徽章:
0
30 [报告]
发表于 2013-01-15 11:45 |只看该作者
回复 25# 方兆国


    尽量避免使用UB,因为很多时候会造成一些难找察觉的bug.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP