2009-06-14 66 views
14

Tôi cũng nhận thức được sự xấu xí của câu hỏi này, tôi vẫn muốn biết nếu có thể:Cách kiểm tra xem con trỏ có hợp lệ không?

Khi chương trình cố gắng đọc/ghi vào cửa sổ không hợp lệ (NULL, khối không được phân bổ, v.v ...) treo ứng dụng với ngoại lệ vi phạm truy cập.

Câu hỏi đặt ra là, có cách nào để kiểm tra thời điểm con trỏ này sẽ tạo ra ngoại lệ trước khi cố gắng sử dụng nó hay không, liệu có cách nào để bắt ngoại lệ này không?

+0

Tương tự như http://stackoverflow.com/questions/683059/how-to-validate-lpvoid-to-bad-ptr/683085#683085 – Michael

+0

Tương tự như http://stackoverflow.com/search?q=IsBadReadptr – ChrisW

Trả lời

7

Đặt cược tốt nhất nếu bạn phải sử dụng con trỏ thô để đảm bảo rằng đó là con trỏ hợp lệ hoặc NULL. Sau đó, bạn có thể kiểm tra xem nó có hợp lệ hay không bằng cách kiểm tra nếu nó bằng NULL.

Nhưng để trả lời câu hỏi của bạn, bạn có thể nắm bắt những thứ này với structured exception handling (SEH).

Điều đó đang được nói, SEH is a bad idea.

0

Tôi không biết về Windows, nhưng trong * nix bạn có thể cài đặt trình xử lý tín hiệu SIGSEGV để chặn ngoại lệ.

+0

Trên Windows, bạn có thể mã một Trình xử lý ngoại lệ có cấu trúc để bắt ngoại lệ. – ChrisW

+0

Xử lý tín hiệu không * nix-specific: nó là một phần của thư viện chuẩn ISO-C – Christoph

+0

Điều này không giúp được gì nhiều: sau khi trình xử lý SIGSEGV kết thúc, chương trình thực hiện trả về chính xác tại cùng vị trí nơi nguyên nhân gốc của tín hiệu bắt nguồn từ . Trừ khi bạn không thoát ra bên trong trình xử lý tín hiệu của mình, bạn sẽ tạo ra một vòng lặp vô tận. Vì vậy nói chung đó là một ý tưởng tồi để bắt SIGSEGV. – lumpidu

3
+0

Tôi biết rằng có IsBadRead/WritePtr, không thể tìm thấy phiên bản hợp lệ. Tuy nhiên, MSDN nói rằng họ đã lỗi thời –

+0

@ Hammer: Xin lỗi, tôi có nghĩa là "Xấu", hiện đã được sửa. Chúng được coi là hình thức xấu bởi vì chúng không phải là chủ đề an toàn, nhưng chúng là điều gần gũi nhất với những gì OP yêu cầu. – RichieHindle

7

Có chức năng IsBadReadPtrIsBadWritePtr mà có thể làm những gì bạn muốn. Ngoài ra còn có an article giải thích lý do bạn không nên sử dụng chúng.

+2

Từ MSDN: "Quan trọng: Chức năng này đã lỗi thời và không nên sử dụng. Mặc dù tên của nó không đảm bảo rằng con trỏ hợp lệ hoặc bộ nhớ được chỉ định là an toàn để sử dụng". –

+0

Búa, có, chúng được đánh dấu là lỗi thời và bài viết tôi liên kết để giải thích lý do. Bạn đang cố gắng đạt được điều gì? – avakar

5

Bạn chắc chắn có thể kiểm tra xem con trỏ là NULL!

if (ptr == NULL) { 
    // don't use it 
} 

Đó là bài kiểm tra di động duy nhất bạn có thể thực hiện. Windows cung cấp các API khác nhau để kiểm tra con trỏ, nhưng như những người khác đã chỉ ra, việc sử dụng chúng có thể có vấn đề.

10

Bắt loại lỗi này là giải quyết các triệu chứng chứ không phải nguyên nhân gốc rễ.

Các thành ngữ sau đây sẽ làm việc trên bất kỳ nền tảng:

  • khởi tạo tất cả các con trỏ tới zero

  • nếu bạn không thể đảm bảo một con trỏ có giá trị, kiểm tra xem nó là phi-0 trước indirecting nó

  • khi xóa đối tượng, đặt con trỏ về 0 sau khi xóa

  • cẩn thận các vấn đề về quyền sở hữu đối tượng khi chuyển con trỏ đến các chức năng khác

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