Tôi có một chức năng cụ thể (trình xử lý tín hiệu) mà tôi muốn phát hiện đệ quy, để tìm hiểu xem hàm có trực tiếp hay gián tiếp được gọi. Bit khó hiểu là hàm gọi một số mã không thuộc quyền kiểm soát của nó tại một thời điểm, và mã đó có thể làm bất cứ điều gì.Phát hiện đệ quy mạnh mẽ ngay cả khi có các bước nhảy không phải cục bộ
Thông thường, tôi chỉ muốn viết một cái gì đó giống như
void foo() {
static int recursed = 0;
if(recursed) {
...
}
recursed = 1;
othercode();
recursed = 0;
}
nhưng trong trường hợp này, tôi đang lo ngại rằng othercode
thể sử dụng một longjmp
hoặc tương tự để thoát ra khỏi, dẫn đến recursed
còn lại tại 1. Trong sự kiện mà chức năng của tôi bị nhảy ra theo cách này, tôi muốn đảm bảo rằng nó không tự coi là đệ quy nếu được gọi sau (thực tế là nó là longjmp
'd ra khỏi không phải là một vấn đề khác).
Lưu ý: Tôi xem xét khả năng là longjmp
. othercode
là trình xử lý tín hiệu chuỗi từ một số mã khác trong tự nhiên và có trình xử lý tồn tại cho ví dụ: SIGSEGV
sử dụng longjmp
để khôi phục ngữ cảnh (ví dụ như trình xử lý ngoại lệ "bảo vệ lỗi"). Lưu ý rằng việc sử dụng longjmp
trong trình xử lý tín hiệu đồng bộ nói chung là an toàn. Trong bất kỳ trường hợp nào, tôi không đặc biệt quan tâm liệu mã khác có an toàn chút nào không, bởi vì nó không phải là điều tôi kiểm soát.
Bạn đang lo lắng về 'longjmp' có khả năng xảy ra, hoặc chỉ là đó là khả năng? – Patashu
@Patashu: Có khả năng. Xem chỉnh sửa của tôi. – nneonneo
Tiêu đề câu hỏi cần được chỉnh sửa để cụ thể hơn, giống như 'Phát hiện lại quyền truy cập ngay cả khi longjmp được sử dụng' – Patashu