2010-01-28 8 views
9

tôi đã khai báo biến cấu trúc trong C có kích thước lớn hơn 1024byte. Khi chạy Coverity (một ứng dụng phân tích mã tĩnh), nó báo cáo rằng biến ngăn xếp này lớn hơn 1024 byte và do đó gây ra lỗi. Tôi muốn biết liệu tôi có cần phải lo lắng về cảnh báo này không? Có thực sự là một giới hạn tối đa cho kích thước của một biến ngăn xếp đơn?Có giới hạn tối đa nào đối với kích thước của một biến nên được phân bổ trên ngăn xếp không?

cảm ơn, che

+0

Chọn 1024 là hoàn toàn tùy ý, biến 512 byte cũng có thể là "nguyên nhân gây lỗi". Và một biến 2048 byte không làm cho nó hai lần như khả năng. Thực hiện lời khuyên này với một pound muối. –

Trả lời

3

Kích thước tối đa của một biến là bị giới hạn bởi kích thước tối đa của stack (đặc biệt, bao nhiêu của ngăn xếp được còn sót lại từ bất kỳ sử dụng hiện nay bao gồm các biến và các thông số từ chức năng cao hơn trên ngăn xếp cũng như quá trình khung trên đầu).

Trên Windows, việc xếp chồng chuỗi đầu tiên là thuộc tính của tệp thực thi set during linking trong khi có thể chỉ định chồng của một chuỗi trong suốt thread creation.

Trên Unix, việc xếp chồng chuỗi đầu tiên thường chỉ bị giới hạn bởi số lượng phòng có cho nó phát triển. Tùy thuộc vào cách Linux cụ thể đưa ra bộ nhớ và việc bạn sử dụng các đối tượng được chia sẻ, điều đó có thể khác nhau. Bạn cũng có thể chỉ định kích thước của một chuỗi trong thời gian thread creation.

2

Vấn đề mà nó đang cố gắng bảo vệ bạn là tràn ngăn xếp, vì các đường dẫn thực thi khác nhau, rất khó tìm thấy trong thử nghiệm. Chủ yếu vì lý do này - nó được coi là hình thức xấu để phân bổ một lượng lớn dữ liệu trên ngăn xếp. Bạn chỉ thực sự có khả năng chạy vào một vấn đề ral trên một hệ thống nhúng mặc dù.

Nói cách khác, nó đặt giới hạn tùy ý cho những gì nó xem xét quá nhiều dữ liệu trên ngăn xếp.

2

Có. Tất nhiên nó bị giới hạn bởi không gian địa chỉ của hệ thống của bạn. Nó cũng bị giới hạn bởi lượng không gian được phân bổ cho ngăn xếp bởi hệ điều hành của bạn, thường không thể thay đổi sau khi chương trình của bạn khởi động nhưng có thể thay đổi trước đó (hoặc bằng tiến trình khởi chạy, hoặc bởi các thuộc tính của tệp thực thi). Trong nháy mắt, kích thước ngăn xếp tối đa trên hệ điều hành OS X của tôi là 8 MiB và trên Linux là 10 MiB. Trên một số hệ thống, bạn thậm chí có thể phân bổ một lượng ngăn xếp khác nhau cho mỗi chủ đề khác nhau mà bạn bắt đầu, mặc dù điều này là hữu ích hạn chế. Hầu hết các trình biên dịch cũng có một giới hạn khác về số lượng chúng sẽ cho phép trong một khung ngăn xếp duy nhất.

Trên máy tính để bàn hiện đại, tôi sẽ không lo lắng về phân bổ ngăn xếp 1k trừ khi chức năng được đệ quy. Nếu bạn đang viết mã nhúng hoặc mã để sử dụng bên trong một hạt nhân hệ điều hành, nó sẽ là một vấn đề. Mã trong hạt nhân Linux chỉ được phép 64 ngăn xếp KiB hoặc ít hơn, tùy thuộc vào tùy chọn cấu hình.

+0

"Trên một số hệ thống, bạn thậm chí có thể phân bổ một lượng ngăn xếp khác nhau cho mỗi chuỗi khác nhau mà bạn bắt đầu, mặc dù điều này có tính hữu ích hạn chế". Nó trở nên hữu ích trên các hệ thống mà mặc định là nhỏ - bạn không thấy sự cần thiết trên Linux của máy tính để bàn, nhưng bạn sẽ sử dụng một số hệ thống nhúng với các ngăn xếp được phân bổ trước và không có bộ nhớ ảo. –

0

Nếu chức năng của bạn được tham gia (trực tiếp hoặc gián tiếp) trong đệ quy, sau đó phân bổ một lượng lớn trên ngăn xếp sẽ giới hạn độ sâu đệ quy và có thể thổi mạnh ngăn xếp. Trong Windows, ngăn xếp ngăn xếp mặc định là 1MB, mặc dù bạn có thể tăng dự phòng tĩnh bằng các lệnh liên kết. Ngăn xếp sẽ phát triển khi nó được sử dụng, nhưng hệ điều hành đôi khi không thể mở rộng nó. Tôi thảo luận chi tiết hơn một chút về trang web của tôi here.

0

Như tôi đã thấy, trình biên dịch C (turbo) cung cấp kích thước tối đa 64000k cho một biến. Nếu chúng ta cần kích thước lớn hơn, thì nó được khai báo là "khổng lồ".

+0

Cùng một thông báo tôi đã thấy khi tôi khai báo biến là int [1000] [1000]. Trình biên dịch hiển thị thông báo lỗi "kích thước mảng quá lớn". Khi tôi nhìn thấy sự giúp đỡ, nó có cùng một thông điệp –

0

Không nên sử dụng một lượng lớn không gian ngăn xếp.

Dưới đây là một liên kết đến mặc định kích thước gcc stack: http://www.cs.nyu.edu/exact/core/doc/stackOverflow.txt

Ngoài ra, bạn có thể chỉ định --stack,xxxxx để tùy chỉnh kích thước ngăn xếp, vì vậy tốt nhất để đảm nhận xxxxx là một con số nhỏ và gắn bó với phân bổ heap.