区块链——Solidity智能合约基础实战(五)
危险的整数溢出以及异常处理
代码段1:
function flow() view public returns(uint){ uint8 mm = 255; return mm; } |
编译运行后可知应该返回的结果为255,实际结果也为255
代码段2:
function flow() view public returns(uint){ uint8 mm = 0; return mm; } |
编译运行后可知应该返回的结果为0,实际结果也为0
代码段3:
function flow() view public returns(uint){ uint8 mm = 255; mm++; return mm; } |
编译运行后可知应该返回的结果为256,实际结果为0,说明溢出
代码段4:
function flow() view public returns(uint){ uint8 mm = 0; mm--; return mm; } |
编译运行后可知应该返回的结果为0(因为uint不能为负数,所以还是0),实际结果为255
由上面4组代码可以知道,在编写代码的过程中,出现上溢或者下溢都会造成不好的影响,所以要进行异常处理。
补充知识:
由于没有pure,红色方框代表编译器认为你可能要调用函数外的变量,并且部署在区块链后不会直接显示出来。
有了pure,蓝色方框就代表这个函数只引用了函数内部的变量。
总结:红色消耗gas,蓝色不消耗gas
代码段5:
function errorTest() returns(int){ int a = 2; int b = 3; return a/b; } |
运行效果:
代码段6:
function errorTest() returns(int){ int a = 2; int b = 0;//不能执行除0操作 return a/b; } |
此处会报错,因为分母不能为0
代码段7:
function errorTest3() returns(int){ int a = 2; return a<<-1; } |
无法通过编译,不能左移负数位
代码段8:
function errorTest4() returns(int){ int a = 2; int b = -1; return a<<b; } |
可以通过编译,但是调用函数时依旧报错,不能左移负数位