以前用VS2015写的c++代码,警告提示并没在代码区显眼的提示(可能是我个人没进行显示设置),虽然这类warning不会影响程序运行,但确实存在溢出的风险,代码体庞大的情况下,可能会出现意外的结果。
最近换了vs2019,代码区提示比较显眼,也就更改了下个人的代码。
这种运算符操作后,产生溢出风险的问题,无非是我们没有注意到定义某个变量时,该类型所占类型值以及一些默认操作符的默认参数占用字节,比如sin()函数,它的参数默认是8字节也就是double,如果传入 float a=2.3 , float b=1.1, sin(a+b);则会引起该警告,因为程序会认为,两个float进行相加,传给一个更大宽度的类型,可能会存在溢出。
float a=2.3;
float b=1.1;
sin(a+b);
sin(double(a+b));
修改方法就是---->
直接将 float a b改为double类型,或者在sin的参数列表中进行强转。
另外,我的程序中也存在诸如 : 1-m_Scale这样的表达式, m_Scale为int,取值 非0即1,但该表达式基本出现在某个目标函数的计算过程中,且目标值类型为浮点型。此时也会出现C26451的警告,但对我个人程序而言,我晓得 这个计算是不会出现警告提示的风险的,so 我不做强转也没啥问题,忽略警告也一样、
double P1 = fabs(this->m_DataSet[Pre_Pos1].X_Axle - this->m_DataSet[Sol[CriticalRobot][tPos1]].X_Axle)*((1 - this->m_Scale)*Area_aSmall + this->m_Scale*Area_aLarge) + fabs(this->m_DataSet[Pre_Pos1].Y_Axle - this->m_DataSet[Sol[CriticalRobot][tPos1]].Y_Axle)*((1 - this->m_Scale)*Area_bSmall + this->m_Scale*Area_bLarge) + fabs(this->m_DataSet[Back_Pos1].X_Axle - this->m_DataSet[Sol[CriticalRobot][tPos1]].X_Axle)*((1 - double(this->m_Scale) *Area_aSmall + this->m_Scale*Area_aLarge) + fabs(this->m_DataSet[Back_Pos1].Y_Axle - this->m_DataSet[Sol[CriticalRobot][tPos1]].Y_Axle)*((1 - this->m_Scale)*Area_bSmall + this->m_Scale*Area_bLarge);