2012-06-29 36 views
6

Môi trường: Microsoft Visual Studio 2010 SP1 với Preminum (10.0.40219.1 SP1Rel), Windows XP SP3Đây có phải là một microsoft VC++ 2010 biên dịch lỗi của "tự động mới (enum_type)"

biên dịch VC10 từ khóa hỗ trợ tự động, nhưng thông tin liên quan đến loại suy luận dường như không phải lúc nào cũng chính xác cho việc liệt kê.

dụ:

#include <type_traits> 

enum fruit_t 
{ 
    apple = 100, 
    banana = 200, 
}; 

int main() 
{ 
    const auto pa = new auto(banana); 
    const auto pb = new fruit_t(banana); 
    static_assert(std::is_same<decltype(pa), decltype(pb)>::value, "not same!"); 
    delete pb; 
    delete pa; 
} 

Đoạn mã trên nên không có lỗi biên dịch thời gian hoặc lỗi thời gian chạy. Nhưng điều đáng ngạc nhiên là, nó biên dịch ok mà không có bất kỳ lỗi hoặc cảnh báo nào, nhưng không chạy đúng. Trình gỡ lỗi cho biết sau khi thoát khỏi chức năng chính:

ĐÚNG BỆNH CAO PHÁT HIỆN: sau% khối hs (# 55) tại 0x00034878. CRT đã phát hiện rằng ứng dụng đã ghi vào bộ nhớ sau khi kết thúc bộ đệm heap.

vì vậy tôi đoán trình biên dịch có thể có lỗi trong loại khấu trừ "tự động". Cửa sổ Assembler bên dưới cho thấy rằng, kích thước memeory được yêu cầu trong lần gọi "operator new" đầu tiên là 1 byte, trong khi "toán tử mới" thứ hai là 4 byte. Nó cho thấy trình biên dịch đã tạo ra một sai lầm lớn về kích thước của loại suy luận.

Bạn có nghĩ đây là lỗi trình biên dịch không? Và có bất kỳ sửa lỗi nào từ Microsoft không?

int main() 
{ 
004113C0 push  ebp 
004113C1 mov   ebp,esp 
004113C3 sub   esp,10Ch 
004113C9 push  ebx 
004113CA push  esi 
004113CB push  edi 
004113CC lea   edi,[ebp-10Ch] 
004113D2 mov   ecx,43h 
004113D7 mov   eax,0CCCCCCCCh 
004113DC rep stos dword ptr es:[edi] 
    const auto pa = new auto(banana); 
004113DE push  1 
004113E0 call  operator new (411181h) 
004113E5 add   esp,4 
004113E8 mov   dword ptr [ebp-104h],eax 
004113EE cmp   dword ptr [ebp-104h],0 
004113F5 je   main+51h (411411h) 
004113F7 mov   eax,dword ptr [ebp-104h] 
004113FD mov   dword ptr [eax],0C8h 
00411403 mov   ecx,dword ptr [ebp-104h] 
00411409 mov   dword ptr [ebp-10Ch],ecx 
0041140F jmp   main+5Bh (41141Bh) 
00411411 mov   dword ptr [ebp-10Ch],0 
0041141B mov   edx,dword ptr [ebp-10Ch] 
00411421 mov   dword ptr [pa],edx 
    const auto pb = new fruit_t(banana); 
00411424 push  4 
00411426 call  operator new (411181h) 
0041142B add   esp,4 
0041142E mov   dword ptr [ebp-0F8h],eax 
00411434 cmp   dword ptr [ebp-0F8h],0 
0041143B je   main+97h (411457h) 
0041143D mov   eax,dword ptr [ebp-0F8h] 
00411443 mov   dword ptr [eax],0C8h 
00411449 mov   ecx,dword ptr [ebp-0F8h] 
0041144F mov   dword ptr [ebp-10Ch],ecx 
00411455 jmp   main+0A1h (411461h) 
00411457 mov   dword ptr [ebp-10Ch],0 
00411461 mov   edx,dword ptr [ebp-10Ch] 
00411467 mov   dword ptr [pb],edx 
    static_assert(std::is_same<decltype(pa), decltype(pb)>::value, "not same!"); 
    delete pb; 
0041146A mov   eax,dword ptr [pb] 
0041146D mov   dword ptr [ebp-0ECh],eax 
00411473 mov   ecx,dword ptr [ebp-0ECh] 
00411479 push  ecx 
0041147A call  operator delete (411087h) 
0041147F add   esp,4 
    delete pa; 
00411482 mov   eax,dword ptr [pa] 
00411485 mov   dword ptr [ebp-0E0h],eax 
0041148B mov   ecx,dword ptr [ebp-0E0h] 
00411491 push  ecx 
00411492 call  operator delete (411087h) 
00411497 add   esp,4 
} 
+1

Trong trình gỡ lỗi, loại 'pa' là gì? – RedX

+0

trình gỡ lỗi hiển thị: chuối 0x000000c8 int; pa 0x000329d8 fruit_t * const; pb 0x00032a18 fruit_t * const. Xấu hổ, nó cho thấy rằng 'chuối' thuộc loại 'int' (không phải 'fruit_t'). Trình gỡ rối của VC10 có nhiều lỗi theo như tôi biết, vì vậy thông tin loại được hiển thị ở trên là đáng ngờ. – jgx

+0

Mặc dù trình gỡ lỗi VS2010 của tôi hiển thị các loại chính xác (quả *) nó bị treo trên các phân vùng được cấp tự động. – RedX

Trả lời

1

Vâng, tôi nghĩ đó là lỗi VS2010. Chạy giống như bạn (hoặc ít nhất là rất giống nhau) với XP SP3 (32-bit) và VS2010 SP1, tôi nhận được cùng một lỗi chính xác. Nó có vẻ là cụ thể đối với enums, như thử nó với các lớp học cho thấy tất cả mọi thứ hoạt động đúng. Tôi cũng đã thử thêm một loại trái cây khác vào enum, với giá trị 100000 chỉ để chắc chắn rằng nó không phải là một cái gì đó ngớ ngẩn như enum của bạn có tất cả các giá trị dưới 255. Kết quả tương tự.

Tôi đã tìm kiếm nhanh tại Microsoft Connect và tôi không thấy báo cáo lỗi cho điều này, vì vậy tôi khuyên bạn nên nhập một báo cáo. Đó là cách tốt nhất để đảm bảo rằng Microsoft biết và có thể sửa nó.

+1

Lỗi này đã được sửa trong VS2012, không có điểm nào trong việc gửi báo cáo phản hồi. –

+5

Tôi cho rằng một báo cáo phản hồi vẫn nên được nộp. Đầu tiên, VS2012 chưa được phát hành. Quan trọng hơn, ngay cả khi (khi) nó được đóng lại là "Sẽ không khắc phục", ít nhất nó sẽ ở đó để những người khác tìm thấy. –

Các vấn đề liên quan