免费注册 查看新帖 |

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
11 [报告]
发表于 2013-01-14 22:31 |只看该作者
回复 9# starwing83


    溢出貌似叫Error吧,这个不是编译器所能处理的吧,不能什么事儿都让编译器作吧,这样让GDB这样的软件情何以堪
  1. int main(int argc, char *argv[])
  2. {
  3.         int a = INT_MAX+1;
  4.         printf("%d", a);
  5.         return 0;
  6. }
复制代码
有报错的
  1. 22:30:07 **** Incremental Build of configuration Debug for project file_2.2.3 ****
  2. Info: Internal Builder is used for build
  3. gcc -O0 -g3 -Wall -c -fmessage-length=0 -o "bin\\file_2.2.3.o" "..\\bin\\file_2.2.3.c"
  4. ..\bin\file_2.2.3.c: In function 'main':
  5. ..\bin\file_2.2.3.c:41:17: warning: integer overflow in expression [-Woverflow]
  6. gcc -o file_2.2.3.exe "bin\\file_2.2.3.o"

  7. 22:30:07 Build Finished (took 250ms)

复制代码

论坛徽章:
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
12 [报告]
发表于 2013-01-14 23:13 |只看该作者
回复 11# 方兆国


    这种是有检测啊……但是如果是这样呢?

int a;
scanf("%d", &a);

a = a + a + a;

然后a大于0x40000000………………

论坛徽章:
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
13 [报告]
发表于 2013-01-14 23:15 |只看该作者
回复 12# starwing83


    那要程序员干嘛……这个a=3*a;这个都算未定义行为的话……

论坛徽章:
1
摩羯座
日期:2013-12-19 10:04:07
14 [报告]
发表于 2013-01-14 23:17 |只看该作者
回复 13# 方兆国

a是int 3*a 本来就是不能确定是不是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
15 [报告]
发表于 2013-01-14 23:20 |只看该作者
回复 14# lin5161678


    这个……,UB,我越来越不能理解了

论坛徽章:
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
16 [报告]
发表于 2013-01-14 23:23 |只看该作者
回复 15# 方兆国


    是这样的,没说你的程序就各种方面都要有B,你可以声明如果用户咋地咋地那么你也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
17 [报告]
发表于 2013-01-14 23:24 |只看该作者
回复 16# starwing83


    意思是只要有输入变量都叫UB吗?

论坛徽章:
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
18 [报告]
发表于 2013-01-14 23:27 |只看该作者
回复 17# 方兆国


    意思是,输入必须在某个范围内,不然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
19 [报告]
发表于 2013-01-14 23:29 |只看该作者
回复 18# starwing83


    额,那么UB不就太多了么

论坛徽章:
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
20 [报告]
发表于 2013-01-14 23:32 |只看该作者
回复 19# 方兆国


    不多不多,这就是有正确世界观的程序员和所谓野路子的区别。通常程序员写程序的时候就会划定处理问题的范围。这样的话就能在此基础上得到正确的结果(对程序的各个边界能有效地验证,而不是碰运气)。

看到问题时,第一时间想到的是范围。在写函数时,考虑在范围内是否能解决。如果范围是全体的输入,那么就没有UB,反之程序本身就是存在UB的,那么C的UB就无所谓罗~
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP