2015-04-23 18 views
9

Tôi đang cố gắng sử dụng một hàm từ thư viện mã nguồn mở. Hàm này không được trưng ra bên ngoài theo mặc định (vì vậy tôi giả sử nó không phải là hàm tiện ích được cung cấp trực tiếp bởi thư viện mã nguồn mở), nhưng tôi cần hàm này để giải quyết một số vấn đề trong mã của tôi, vì vậy bằng cách nào đó tôi đã thực hiện một số thay đổi trong makefile để lộ ra chức năng từ thư viện.Làm thế nào để tìm một hàm có reentrant

Bây giờ câu hỏi đặt ra là làm thế nào để đảm bảo chức năng này được thực hiện lại.

Tôi không thể tìm ra bằng mắt thường, bởi vì nó đang gọi một số hàm bên trong.

Để biết chính xác, tôi tò mò muốn biết nếu có bất kỳ công cụ nào có sẵn hoặc bất kỳ tùy chọn nào trong GDB để kiểm tra xem chức năng của tôi có chỉ sử dụng các biến cục bộ hay không.

+6

Nếu không chắc chắn và bạn có thể sửa đổi (có vẻ như bạn đang), hãy làm cho hàm không tái nhập với một số mutex tĩnh. –

+1

bạn có thể kiểm tra mã bị ngắt. nó có thể không có giá trị nỗ lực mặc dù ... –

+0

Bạn chỉ có thể gọi chức năng, và gọi một gián đoạn và gọi chức năng một lần nữa và xem những gì sẽ xảy ra. Nếu nó hoạt động tồi tệ. –

Trả lời

1

Cách để xác định xem một hàm có phải là reentrant hay không là phân tích những gì nó làm.

1) Nó không truy cập các hình cầu trừ khi các hoạt động trên các hình cầu đó là nguyên tử (ví dụ: không có cách nào để đọc và sửa đổi đồng thời toàn cục). Điều này thường có nghĩa là tránh sử dụng hình cầu hoặc đảm bảo quyền truy cập đồng bộ với chúng - ví dụ: tất cả các mã mà sửa đổi và đọc toàn cầu giữ một mutex cho đến khi thực hiện, do đó, các hoạt động được tuần tự hóa. Hoặc mã số

2) Mã không tự sửa đổi (may mắn thay, mã tự sửa đổi tương đối hiếm ở tiêu chuẩn C hoặc C++).

3) Không gọi các hàm khác không phải là hàm reentrant (bao gồm số hàm công bằng trong thư viện chuẩn) hoặc chương trình (ví dụ: đa xử lý thường phức tạp kiểm soát cần thiết để đảm bảo reentrancy).

Tôi không biết về bất kỳ công cụ cụ thể nào để phân tích một hàm để xác định reentrancy. Thông thường một hàm được thiết kế để được reentrant (hoặc không). Trong thực tế, nếu không có tài liệu nói rằng một chức năng đã được thiết kế để được reentrant, nó là một cược công bằng nó không phải là reentrant.

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