这是Visual Studio 2010中的编译器错误吗
Is this a compiler error in Visual Studio 2010?
我在这个条件中有一个错误:
while(CurrentObserverPathPointDisplacement > lengthToNextPoint && CurrentObserverPathPointIndex < (PathSize - 1) )
{
CurrentObserverPathPointIndex = CurrentObserverPathPointIndex + 1;
CurrentObserverPathPointDisplacement -= lengthToNextPoint;
lengthToNextPoint = (CurrentObserverPath->pathPoints[min((PathSize - 1),CurrentObserverPathPointIndex + 1)] - CurrentObserverPath->pathPoints[CurrentObserverPathPointIndex]).length();
}
在释放模式下,它似乎陷入了一个无限循环。在调试模式下运行良好,或者当我在最后一行上打印调试打印时更有趣
OutputInDebug("Here");
以下是为条件本身生成的程序集:
while(CurrentObserverPathPointDisplacement > lengthToNextPoint && CurrentObserverPathPointIndex < (PathSize - 1) )
00F074CF fcom qword ptr [dist]
00F074D2 fnstsw ax
00F074D4 test ah,5
00F074D7 jp ModelViewData::moveCameraAndCenterOnXYPlaneForwardBackward+27Eh (0F0753Eh)
00F074D9 mov eax,dword ptr [dontRotate]
00F074DC cmp eax,ebx
00F074DE jge ModelViewData::moveCameraAndCenterOnXYPlaneForwardBackward+27Eh (0F0753Eh)
{
您可以看到,对于第二个条件,它似乎将bool类型的函数参数"dontRotate"的值移动到eax中,然后与之进行比较,但dontRotae的使用与代码的使用相去甚远。
我知道这可能是一个有点小的数据,但就我个人而言,这似乎是一个明显的编译器错误。但遗憾的是,我不知道如何将其提炼成一个足够独立的问题来实际生成错误报告。
编辑:不是实际减速,而是类型:
double CurrentObserverPathPointDisplacement;
double lengthToNextPoint;
int CurrentObserverPathPointIndex;
int PathSize;
vector<vector3<double>> CurrentObserverPath::pathPoints;
第2版:
一旦我在这段时间的末尾添加调试打印语句,这就是生成的程序集,它不再表达错误:
while(CurrentObserverPathPointDisplacement > lengthToNextPoint && CurrentObserverPathPointIndex < (PathSize - 1) )
00B1751E fcom qword ptr [esi+208h]
00B17524 fnstsw ax
00B17526 test ah,5
00B17529 jp ModelViewData::moveCameraAndCenterOnXYPlaneForwardBackward+2D6h (0B175A6h)
00B1752B mov eax,dword ptr [esi+200h]
00B17531 cmp eax,ebx
00B17533 jge ModelViewData::moveCameraAndCenterOnXYPlaneForwardBackward+2D6h (0B175A6h)
{
此处:
while(/* foo */ && CurrentObserverPathPointIndex < (PathSize - 1) )
{
CurrentObserverPathPointIndex = CurrentObserverPathPointIndex + 1;
由于这是循环中CurrentObserverPathPointIndex
发生变化并且CurrentObserverPathPointIndex
和PathSize
都是相同大小的有符号整数(并且PathSize
足够小,可以排除整数提升问题)的唯一点(除非min
做了一些非常恶劣的事情),因此剩余的浮点篡改是不相关的。循环最终必须终止(不过,如果CurrentOvserverPathPointIndex
的初始值与PathSize
相比较小,则可能需要相当长的时间)。
这只允许得出一个结论;如果编译器生成的代码没有终止(永远),则编译器是错误的。
看起来PathSize
在循环中没有改变,所以编译器可以在循环之前计算PathSize - 1
,并巧合地使用与dontRotate
相同的内存位置,不管是什么。
更重要的是,CurrentObserverPath->pathPoints
中有多少元素?
您的环路条件包括此测试:
CurrentObserverPathPointIndex < (PathSize - 1)
在你的循环中是这样的任务:
CurrentObserverPathPointIndex = CurrentObserverPathPointIndex + 1;
然后是这个进一步增加的下标:
[min((PathSize - 1),CurrentObserverPathPointIndex + 1)]
也许你的代码似乎在调试模式下工作,因为随机的未定义行为似乎可以工作?
- MSVC多行宏编译器错误
- 静态数据成员的问题-修复链接错误会导致编译器错误
- C++,我收到一个无法理解的编译器错误
- 我收到同义重复编译器错误。我应该如何修复"类型"X"的参数与类型"X"的参数不兼容?
- 重载方法的方式会在使用临时调用时生成编译器错误
- 尝试使用继承和模板实现CRTP.Visual Studio正在生成编译器错误
- 编译器错误:destuctor 的更宽松的抛出说明符
- Android NDK clang 编译器错误在 Windows 上显示'No such file or directory'
- C++ G++ 编译器 - 错误:隐式声明的定义
- 这个失败的测试是将零添加到空指针未定义的行为、编译器错误还是其他什么?
- 模板模板参数和模板别名:编译器错误?
- C++ 编译器错误:P1LinkedList.cpp:145:错误:重载的"to_string(int&)"调用不明确
- 在gcc中意外调用了Const重载.编译器错误或兼容性修复程序
- C1001内部编译器错误是由于矢量初始化(如数组)引起的
- 编译器错误(英特尔并行工作室 2019 与 Visual Studio 社区 2019)
- 如何在C++中克服此 C4430 编译器错误?
- 尝试使用 WinBGI 显示文本时出现编译器错误
- 使用typedef'ed返回类型声明友元函数时出现编译器错误
- 如何在类模板的成员函数中正确调用函数对象?正在生成 Visual Studio 编译器错误 C2440
- C++自定义分配器大小参数作为模板参数会引发编译器错误