2014-04-24 26 views
8

Tôi sử dụng Visual Studio 2010 với Code Analysis được kích hoạt. Trong mã của tôi có một ranh giới phân bổ một số bộ nhớ trong một chức năng:Thông báo cảnh báo về kích thước ngăn xếp

TCHAR someString[40000]; 

Các phân tích mã ném một thông điệp cảnh báo:

cảnh báo C6262: Chức năng sử dụng '40000' byte của ngăn xếp: vượt quá/phân tích: stacksize'16384 '. Cân nhắc di chuyển một số dữ liệu sang heap

Tôi tự hỏi mình có nên cảnh báo nghiêm túc không. Tôi có phải đối mặt với một số rắc rối thực sự nếu tôi cấp phát một số bộ nhớ trên ngăn xếp> 16384 không? Hay đó chỉ là một thông điệp cảnh báo chung nhắc nhở tôi rằng tôi phải chăm sóc kích thước ngăn xếp của mình nói chung? Theo tôi biết kích thước ngăn xếp mặc định là 1MB (nếu bạn sử dụng Visual Studio).

+0

Tôi không gặp bất kỳ sự cố nào với điều đó – Quest

+0

Nếu chức năng này không sử dụng đệ quy và là hàm duy nhất phân bổ nhiều bộ nhớ ngăn xếp, nó sẽ ổn. Tuy nhiên, bạn có thể muốn xem xét di chuyển nó đến heap, chỉ trong trường hợp. – Kelm

+1

@MichaelXanadu: Có lời giải thích thú vị về điều này trên trang MSDN: http://msdn.microsoft.com/en-us/library/7yhee2f0.aspx .Trên đề xuất trang này đã được đưa ra để sử dụng bộ nhớ heap thô hoặc vùng chứa STL tốt hơn như std :: string std :: vector trong trường hợp này. –

Trả lời

5

Phải thừa nhận rằng, thông báo đó có thể gây nhầm lẫn vì VS (thuộc tính dự án) báo cáo mặc định là 1M. Tuy nhiên, nếu bạn nhìn vào văn bản của warning, bạn sẽ lưu ý rằng giới hạn thực sự là 16k cho Phân tích mã. Làm theo các bước ở cuối liên kết đó để sửa cảnh báo.

+0

Kích thước ngăn xếp thực sự là 1MB và thông báo cảnh báo sẽ được ném mỗi khi kích thước ngăn xếp vượt quá ngưỡng được xác định (ví dụ: 16K)? – MichaelXanadu

+1

Có. Đối với mục đích Phân tích Mã, trừ khi bạn thay đổi nó, kích thước ngăn xếp là 16k. Bạn có thể ghi đè giới hạn đó khi thực hiện phân tích. – rrirower

+3

@rrirower: không hoàn toàn. Phân tích mã không xem xét ngăn xếp là 16k, nó chỉ xem xét nó đáng ngờ khi một hàm duy nhất sử dụng hơn 16 nghìn ngăn xếp. Điều đó hoàn toàn khác. OTOH Tôi thực sự muốn cảnh báo sẽ liệt kê các biến lớn nhất trên stack cho tôi: / –

1

Tôi thấy rằng các cảnh báo như vậy phải được thực hiện nghiêm túc. Tôi đã có một tuyên bố

{ // some local branch deep inside a function 
char T[2000000]; 
    ... 
} 

trái do nhầm lẫn ở đâu đó sâu bên trong một hàm lớn. Hàm luôn luôn bị lỗi ngay sau khi nhập vào hàm, ngay cả khi khai báo trong nhánh địa phương ở xa, và tôi chưa bao giờ đến đó với trình gỡ lỗi. Rất khó để tìm thấy trong MS Visual Studio, ngay cả khi phân tích mã đã cho tôi một cảnh báo.

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