除以0警告
Divide by 0 warning
我一直在开发一个应用程序,因为图像看起来很奇怪,我决定打开Wall标志,看看是否有什么奇怪的事情发生。它显示了一个新的警告:
character.cpp(364): warning C4723: potential divide by 0
奇怪的是,在这一点上没有任何分歧:
//Currently hp is always equal to 30
for (int i = 0; i < hp; i++) {
int startXPos = i*12 + 40;
if (i == hp-1) {
gfx.DrawLine(10+startXPos,15,10+startXPos,40,245,245,245); //This line
//This function expects: int, int, int, int, int, int, int
}
}
现在,只有当我使用/Ox
-标志(完全优化)进行编译时,才会出现此警告。使用/Od
(无优化)编译时,我不会收到警告。
我的问题是:我应该忽略这个警告吗?还是我应该担心?是什么原因造成的?
更新:
DrawLine功能的一部分:
int dx = x2 - x1;
int dy = y2 - y1;
if( dy == 0 && dx == 0 ) {
//1 pixel line
}
else if( std::abs( dy ) > std::abs( dx ) ) {
if( dy < 0 ) {
std::swap(x1,x2);
std::swap(y1,y2);
}
float m = static_cast<float>(dx / dy);
//No different/more division past this point
发生警告是因为"dy"可能为零:
int dy = y2 - y1;
"dy"用于除法:
float m = static_cast<float>(dx / dy);
如果"y2"answers"y1"具有相同的值,则与执行此操作相同:
float m = static_cast<float>(dx / 0);
很难知道如何正确修复,因为我们没有完整的算法,但作为最低要求:在将dy用作除数之前检查它。例如:
float m = static_cast<float>(dy ? dx/dy : 0); // 0 depends on your algorithm...
或者你可以把这条线全部剪在一起,解释y1&y2等于一条根本不应该绘制的无限小的线,在这种情况下,如果dx或dy等于0,您将立即退出DrawLine函数。
相关文章:
- 警告处理为错误这里有什么问题
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- cppcheck在const std::string[]上引发警告
- GCC对可能有效的代码抛出init list生存期警告
- 如何在BST的这个简单递归实现中消除警告
- 关于std::move的使用,是否有编译警告
- g++ 在某个类成员未初始化时不发出警告
- 处理除以零会导致<csignal>意外行为
- 如何处理来自核心指南检查器的关于gsl::at的静态分析警告
- 使用typeid警告未使用的变量
- 示例C++项目编译中的警告
- 警告:在函数返回类型 [-Wignore 限定符] 时忽略类型限定符
- 如何修复编译器警告 C6386 和 C6385?
- 返回语句后的代码,没有警告
- 获取隐式转换溢出从无符号到已签名的警告
- 编译器警告:执行到达值返回函数的末尾而不返回值
- 在未链接的部分上生成警告
- C++警告:双精度除以零
- 除以0警告
- 为什么此代码中没有除以零编译时警告或运行时崩溃