Visual Studio 2013中可能的C / C ++编译器错误

视音频

以下C或C ++代码的输出应为“ 11,11,11”,但是使用Visual Studio Professional 2013(版本12.0.40629.00更新5)时,输出为“ 11,0,0”!这仅在发行版本中发生,并在关闭优化后消失。这是编译器错误吗?

#include <stdio.h>

int main(void)
{
    int A[100] = { 0 };
    int row = 0;   // BUG disappears if we make this const or short or char...
    int ncols = 3; // BUG disappears if we make this const or short or char...

    for (int y = row; y <= row; ++y)
    {
        for (int x = 0; x < ncols; ++x)
        {
            const int index = y * ncols + x;

            //A[index] = 11;           // (no bug !)
            *(A + index) = 11;       // BUG!!!
            //*(A + y*ncols+x) = 11;   // (no bug !)
            //*(A + (y*ncols+x)) = 11; // BUG!!!
        }
    }

    for (int x = 0; x < ncols; ++x)
    {
        printf("%d,", A[x]);
    }

    return 0;
}
蚂蚁

是的,它似乎是编译器错误。在Win32版本的代码中,编译器使用registeresi表示y和registeredx表示x正如@Ajay Brahmakshatriya在注释中正确指出的那样,似乎编译器尝试交换周期(将内部交换为内部),但最终得到不正确的代码。由于某种原因,最后一个条件跳转指令(应该表示[交换的]内部循环)将控制转移到也要检查的位置esi该检查过早结束了迭代。

0018206B  xor         esi,esi             ; This is `y`
0018206D  xor         edx,edx             ; This is `x`
...
00182070  test        esi,esi  
00182072  jg          main+5Ch (018209Ch) ; Exit from the outer cycle?

00182074  lea         eax,[edx+esi*2]     ; Recalculate the starting storage location
00182077  add         eax,esi             ; for the next cycle:
00182079  lea         ecx,[A]             ; eax = esi * 3 + edx
0018207F  lea         eax,[ecx+eax*4]     ; eax = &A[eax]
...
00182082  mov         ecx,1               ; It is not exactly clear to me what this is 
00182087  sub         ecx,esi             ; supposed to do, but when `esi` is `0`, it 
00182089  add         esi,ecx             ; leaves `ecx` as 1, which is correct 
                                          ; number of iterations for outer cycle
...
00182090  mov         dword ptr [eax],0Bh ; Storing the value
00182096  lea         eax,[eax+0Ch]       ; Updating the pointer for the next storage location 
00182099  dec         ecx  
0018209A  jne         main+50h (0182090h) ; Outer cycle [exchanged]

0018209C  inc         edx  
0018209D  cmp         edx,3  
001820A0  jl          main+30h (0182070h) ; Inner cycle [exchanged]: for some reason it
                                          ; jumps to `test esi,esi`, which is what
                                          ; suddenly terminates the iterations

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

也许是Visual Studio 2015中的C#编译器错误

Visual Studio 2015更新3-C ++编译器错误?

Visual Studio 2013和2015中的C ++编译器错误C2280“试图引用已删除的函数”

在Visual Studio 2013中使用Roslyn编译器

如何在Visual Studio 2015中使用roslyn C#编译器?

Visual Studio C ++编译器怪异行为

Visual Studio 2015更新1中C ++的内部编译器错误

使用Visual Studio编译器分析内联的C ++函数

Visual Studio 2015 C ++编译器可能提供代码内指令集标记

如何在Visual Studio Code for TypeScript中完全导入而获得编译器错误消息?

仅在发行版中的Visual Studio 2019“ C1001内部编译器错误”

使用g ++编译器在Visual Studio中编译C ++程序会在最后生成%

这是Visual Studio 2010编译器中的错误吗?

如何防止输出屏幕在Visual Studio 2013 C ++编译器中消失

C ++:使用Visual Studio编译器时的const指针

在Visual Studio 2013中更改编译器错误语言

拆解Visual Studio Intel编译器C ++代码

static_assert(std :: is_abstract)在Visual Studio 2013中导致编译器错误

什么是 ?和@符号表明此编译器错误?-Visual Studio 2013编译器

C ++ Visual Studio 2013编译错误?

可能的Visual Studio 2015 C ++编译器和IntelliSense错误

在Visual Studio 2013中编译简单的C代码

是否应该在Visual Studio C#编译器中将此列表初始化器行为报告为错误?

哪些编译器选项用于在Visual Studio中编译C ++ STL类/函数?

确定C ++编译器是否将在Visual Studio中以某种方式进行优化

Visual Studio 可能是错误的编译器错误

Visual Studio Code 的 C/C++ 扩展如何找到默认编译器?

Visual Studio C++ 编译器尝试编译 CUDA C/C++ 文件

如何使用 Visual Studio 编译器在 Windows 上编译 cython 编译的 c 代码