2011-01-18 25 views
8

EDIT: Do nhận xét đúng về ví dụ của tôi, tôi đã xóa nó và chuyển thành câu hỏi chung:Công cụ để xử lý sự cố tham nhũng trong C++

Một số lần trong dự án của tôi. Không có vấn đề bao nhiêu tôi chiến đấu để viết mã để tránh nó, đôi khi nó chỉ là không thể tránh khỏi. Nhưng khi nó xảy ra những cách để chống lại nó là gì?

Tôi đã tìm thấy một macro được cung cấp bởi người bạn tốt trong blog này: http://rxwen.blogspot.com/2009/04/detect-stack-corruption.html đọc giá trị đăng ký ebp để phát hiện tham nhũng.

Nhưng có những ràng buộc là các công cụ tinh vi hơn để giúp bạn không tự chụp chân. Tôi đang lập trình trong Windows bằng cách sử dụng Codeblocks và trình biên dịch gcc. Lý do tôi đưa ra câu hỏi này là tìm các công cụ mà tôi có thể sử dụng trong môi trường lập trình của mình để giúp tôi phát hiện những sai lầm như vậy và sửa chúng. Bất kỳ đề xuất?

Cảm ơn bạn đã trả lời và dành thời gian đọc câu hỏi của tôi.

+2

1. Không có mã thực tế nào được đăng. 2. Làm thế nào để bạn biết rằng có ngăn xếp tham nhũng? 3. Tại sao bạn nghĩ vấn đề nằm ở nơi bạn đã chỉ ra? 4. Bạn có thể đăng nội dung của các thành viên và các nhà xây dựng của lớp 'artist' không? –

+0

Tôi sẽ thuật lại câu hỏi. Không nên đăng ví dụ này. Nó không phải là một ví dụ thực sự về tham nhũng trong dự án của tôi, chỉ là một ví dụ về một tham nhũng mà tôi đã phải đối phó trong quá khứ, điều đó thực sự gây ra một số điện thoại trên dây thần kinh của tôi. Tôi sẽ biến điều này thành một câu hỏi chung về sự tham nhũng ngăn xếp và các công cụ để xử lý nó. – Lefteris

+1

đôi khi nó chỉ là không thể tránh khỏi Đó chỉ là poppycock. Công cụ tốt nhất của bạn để tránh tham nhũng ngăn xếp là kỹ thuật tốt và tuân thủ các thực hành tốt nhất. –

Trả lời

4

Không rõ là bạn đang gặp phải sự cố tham nhũng ngăn xếp. Nhưng tôi chấp nhận có một số tham nhũng dữ liệu.

Một kỹ thuật có hiệu quả một cách hợp lý là để thêm các trường bảo vệ xung quanh lĩnh vực nghi ngờ (s):

... 
long namecheck1; 
Artist artist; 
long namecheck2; 
... 

Có constructor khởi tạo những đối với hầu hết bất cứ điều gì, nhưng mà không biết bản chất của tham nhũng một cái gì đó khác không dường như thỏa mãn hơn.

myclass::myclass() : namecheck1(0x12345678), namcheck2(0x12345678) ... 

Thêm một quán thành viên kiểm tra chức năng:

void myclass::isokay() 
{ 
     if (namecheck1 != namecheck2 || 
      namecheck2 != 0x12345678) 
      cerr << "the object is corrupted"; 
     ... // maybe wait for input, cause core dump, etc. 
} 

Sau đó tiêu mã với các cuộc gọi đến này, đặc biệt là gần luận lý đáng ngờ. Nếu bạn cảm thấy thoải mái với trình gỡ lỗi, hãy đặt điểm ngắt trên thông báo lỗi. Bằng cách làm sáng tỏ các ngăn xếp, bạn có thể xác định những gì chương trình đã làm gần đây và thu thập manh mối như những gì bit của mã có lẽ là viết bên ngoài các giới hạn thích hợp.

+2

Gợi ý: Thay vì '0x12345678', sử dụng tiêu chuẩn' 0xBAADF00D' hơn. :) – Mehrdad

+0

Tôi không nhận ra có một mẫu tùy ý chuẩn! :-) – wallyk

+3

Tôi cũng đã thấy 0xDEADBEEF. –

1

Valgrind tìm tất cả các loại tham nhũng bộ nhớ.

GCC có mudflap (-fmudflap và bạn bè) và -fstack-protector để bắt gặp sự cố truy cập bộ nhớ. Các trình biên dịch khác cũng có thể làm.

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