请选择 进入手机版 | 继续访问电脑版

专注代码检测 - 阅镜

 找回密码
 立即注册
热搜: 安装 代码
查看: 114|回复: 0

注意隐式符号转换

[复制链接]

70

主题

70

帖子

232

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
232
发表于 2021-9-10 14:21:06 | 显示全部楼层 |阅读模式
两个无符号数相减为负数时,结果应当为一个很大的无符号数,但是小于int的无符号数在运算时可能会有预期外的隐式符号转换。


  1. // 1
  2. unsigned char a = 1;
  3. unsigned char b = 2;

  4. if (a - b < 0)  // a - b = -1 (signed int)
  5.   a = 6;
  6. else
  7.   a = 8;

  8. // 2
  9. unsigned char a = 1;
  10. unsigned short b = 2;

  11. if (a - b < 0)  // a - b = -1 (signed int)
  12.   a = 6;
  13. else
复制代码


上述结果均为a=6

  1. // 3
  2. unsigned int a = 1;
  3. unsigned short b = 2;

  4. if (a - b < 0)  // a - b = 0xffffffff (unsigned int)
  5.   a = 6;
  6. else
  7.   a = 8;
  8.   
  9. // 4
  10. unsigned int a = 1;
  11. unsigned int b = 2;

  12. if (a - b < 0)  // a - b = 0xffffffff (unsigned int)
  13.   a = 6;
  14. else
  15.   a = 8;
复制代码

上述结果均为a=8

如果预期为8,则错误代码:

  1. // Bad
  2. unsigned short a = 1;
  3. unsigned short b = 2;

  4. if (a - b < 0)  // a - b = -1 (signed int)
  5.   a = 6;
  6. else
  7.   a = 8;
复制代码

正确代码:

  1. // Good
  2. unsigned short a = 1;
  3. unsigned short b = 2;

  4. if ((unsigned int)a - (unsigned int)b < 0)  // a - b = 0xffff (unsigned short)
  5.   a = 6;
  6. else
  7.   a = 8;
复制代码

关联漏洞:
  1.   中风险-逻辑漏洞
复制代码

回复

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies |上传

本版积分规则

QQ|Archiver|手机版|小黑屋| 阅镜 ( 京ICP备2020034574号 )|网站地图|网站地图点击这里给我发消息

GMT+8, 2022-1-17 08:27 , Processed in 0.064773 second(s), 20 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表