Làm cách nào để chúng tôi có được thông tin này? Tôi đoán nó là hệ điều hành phụ thuộc, và tôi đang chạy Windows vì vậy câu hỏi của tôi đề cập đến các API cửa sổ.Làm cách nào chúng tôi có thể thăm dò trạng thái ngăn xếp - bộ nhớ không sử dụng (có sẵn)
Có chức năng nào có thể làm điều đó cho chúng tôi - nhận bộ nhớ ngăn xếp còn lại cho chuỗi cuộc gọi không?
Ngoài ra, nếu chúng ta có thể tìm hiểu các chi tiết sau đây, chúng tôi sẽ có thể tính toán rằng ngày của riêng của chúng tôi:
- Lấy thread stack cơ sở địa chỉ. Phải có một số hàm nhận dạng chuỗi làm thông số và trả về một số thông tin về nó (Chẳng hạn như ... Địa chỉ cơ sở ngăn xếp?)
- Lấy kích thước ngăn xếp chủ đề. Nếu chủ đề đã được chúng tôi bắt đầu, chúng tôi có thể biết nó (Vì chúng tôi đã chỉ định nó khi gọi
CreateThread
). Nhưng nếu nó là chủ đề chính, được bắt đầu bởi hệ điều hành cho chương trình của chúng tôi, hoặc bất kỳ chủ đề nào khác chúng tôi đã không bắt đầu một cách rõ ràng, làm thế nào để chúng tôi tìm thấy nó? - Lấy con trỏ ngăn xếp hiện tại. Vâng, đó là dễ dàng hơn. chúng tôi có thể kiểm tra nó bằng
esp
hoặc lấy địa chỉ của biến địa phương để nhận vị trí gần.
Đây là mục đích giáo dục, nhưng tôi đoán nó có thể được sử dụng để ngăn chặn thuật toán đệ quy gây tràn ngăn xếp - Thay vì sử dụng bất kỳ hàm giới hạn độ sâu tối đa nào.
Lưu ý rằng [Itanium có * hai ngăn xếp *] (http://blogs.msdn.com/b/oldnewthing/archive/2005/04/21/410397.aspx). Cho đến nay, tất cả mọi người chỉ nhìn vào ngăn xếp biến cục bộ, nhưng cũng có ngăn xếp đăng ký (đó là nơi các địa chỉ trả về đi, trong số những thứ khác). Vì vậy, kỹ thuật này là không đủ để ngăn chặn tràn ngăn xếp bởi vì bạn đang kiểm tra chỉ một trong các ngăn xếp. –
Thú vị ... Nhưng nếu "ngăn xếp đăng ký" này thực sự * phụ thuộc phần cứng *, không nên Intel hoặc bất cứ ai thực hiện nó sử dụng ngăn xếp cuộc gọi thông thường để phân bổ biến cục bộ nếu ngăn xếp đăng ký đầy; Sau khi tất cả, sử dụng đăng ký để lưu trữ các biến địa phương không phải là phải, phải không? – Jong
Không có luật nào nói rằng tất cả các bộ vi xử lý phải giống như x86. (Và Itanium không phải là bộ vi xử lý duy nhất có cửa sổ đăng ký.) –