2013-05-09 18 views
5

Trong clang, có cách nào để bật kiểm tra giới hạn cho truy cập [] tới std :: vectơ và các vùng chứa STL khác, tốt nhất là khi chỉ xây dựng ở chế độ gỡ lỗi?Bounds kiểm tra std :: vector (và các container khác) trong clang?

Tôi vừa bỏ ra hàng giờ để tìm kiếm một lỗi nhỏ mà hóa ra là do chúng tôi truy cập vào phần cuối của một std :: vector. Nó không cần phải làm bất cứ điều gì thông minh khi nó phát hiện lỗi, chỉ cần bẫy trong trình gỡ lỗi để tôi có thể tìm ra nơi nó xảy ra và sửa chữa nó trong mã.

Có cách nào để thực hiện việc này ngoài cách "tạo loại của riêng bạn mà kế thừa từ std :: vector" mà tôi muốn tránh không?

(Tôi đang sử dụng phiên bản kêu vang 3.1 nếu mà làm cho một sự khác biệt.)

+1

Vâng, sử dụng 'at()' thay vì 'toán tử []'. Điều đó được định nghĩa để cung cấp cho bạn giới hạn thời gian chạy kiểm tra –

+2

Tôi khuyên bạn không nên sử dụng tại(). Trong khi nó ném một ngoại lệ, đây không phải là giúp đỡ nhiều, vì thường không có kiểm tra ngoại lệ chặt chẽ được thực hiện xung quanh mã vectơ. Các lỗi out_of_range xa ​​hơn là các lỗi thông thường, do đó chúng không được theo dõi bằng cách sử dụng các ngoại lệ, nhưng gỡ lỗi các trình trợ giúp và xác nhận. – Martin

Trả lời

2
#define _GLIBCXX_DEBUG 

Điều này cho phép tất cả các loại nội tuyến kiểm tra (xem vector và debug/vector)

+0

Tính năng này có hoạt động khi được sử dụng với libC++ hay chỉ với libstdC++ không? Tôi hiện đang sử dụng libC++ vì có vẻ như không khả dụng khi tôi đang biên soạn với libstdC++ ... – Colen

+0

Tôi không chắc chắn; Tôi bắt nguồn này bằng cách đọc các tiêu đề trong Cygwin; a. Tuy nhiên, có thể dễ dàng kiểm tra - viết một chương trình đơn giản với một vectơ độ dài đã biết và xem điều gì xảy ra khi bạn đọc qua nó. có sẵn trên gcc 4.5.3 nhưng tôi không thấy nó trên 3.4.4 –

+3

'_GLIBCXX_DEBUG' hoạt động trong libstdC++, không phải libC++. Trên libC++, tôi tin rằng bạn có thể sử dụng '_LIBCPP_DEBUG2'. Lưu trữ giá trị 0 hoặc 1 cho giá trị đó cho các mức gỡ lỗi khác nhau. –

3

Nếu bạn đang sử dụng Linux hoặc OS X, bạn nên nhìn vào địa chỉ khử trùng:

http://clang.llvm.org/docs/AddressSanitizer.html

Nó giới thiệu một sự suy giảm 2x, nhưng thực hiện một loạt các bộ nhớ kiểm tra và có thể bắt lỗi của bạn.

Một công cụ tuyệt vời khác đã tiết kiệm cho tôi vô số lần là valgrind. Nếu bạn có thể chạy với valgrind nó sẽ bắt một tấn lỗi bộ nhớ và rò rỉ.

+0

Lưu ý rằng AddressSanitizer sẽ không bắt được tất cả các lỗi logic. Ví dụ: nếu bạn có 'std :: vector vec; vec.reserve (10); 'sau đó truy cập' vec [5] 'là một lỗi nhưng sẽ không bị ASan phát hiện vì nó nằm trong bộ nhớ được cấp phát. –

2

libstdc++ có độ tuổi debug mode trưởng thành sử dụng -D_GLIBCXX_DEBUG.

libc++ cũng có một debug mode sử dụng -D_LIBCPP_DEBUG nhưng như chúng ta có thể nhìn thấy danh sách gửi thư này discussion: Status of the libc++ debug mode nó là không đầy đủ:

| My understanding is that this work was never completed and it's probably broken/incomplete.

That is correct. It’s on my list of things to fix/implement, but it’s not something that I will get to anytime soon.

Nó dường như làm việc cho std::vector trên 3.4 và lên see it live, cung cấp cho các chương trình sau đây:

#include <vector> 
#include <iostream> 

int main() 
{ 
    std::vector<int> v = {0,1,2,3} ; 

    std::cout << v[-1] << std::endl ; 
} 

nó tạo ra lỗi sau:

vector[] index out of bounds

Aborted

+0

Xem [tài liệu chế độ gỡ lỗi libC++ đã cập nhật] (https://libcxx.llvm.org/docs/DesignDocs/DebugMode.html) –

+0

Xem [mailing list thread here] (http://lists.llvm.org/pipermail/cfe -dev/2014-June/037298.html) Tôi đoán lưu trữ đã di chuyển :-p –

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