2012-06-02 67 views
6

thể trùng lặp:
Best way to detect integer overflow in C/C++phát hiện tràn tự động trong C++?

Thông thường khi tôi đã được mã hóa một cái gì đó trong C++ sử dụng một số lượng lớn tôi không thể nói khi tràn đang xảy ra, ngay cả khi tôi đang sử dụng một cái gì đó giống như một loại dữ liệu dài 64 bit hoặc dài khác. Có cách nào hiệu quả để phát hiện khi tràn xảy ra hơn là chứng kiến ​​các giá trị sai?

+1

Thay vì sử dụng các giá trị nguyên liệu, bạn có thể sử dụng đối tượng với các nhà khai thác số học quá tải mà ném ngoại lệ khi tràn xảy ra. – jamesdlin

+2

hoạt động mà bạn đang thực hiện trên các con số là gì? – Baget

+0

@Baget có thể là bất cứ thứ gì. cộng, trừ, nhân, số mũ, v.v. phụ thuộc vào chương trình. –

Trả lời

2

Có thể không có nhiều mà bạn sẽ nhận được từ tiêu chuẩn C++:

5 Expressions

Nếu trong quá trình đánh giá một biểu thức, kết quả là không toán học xác định hoặc không nằm trong phạm vi giá trị có thể biểu thị cho loại của nó, hành vi không xác định. [Lưu ý: hầu hết các triển khai hiện tại của C++ đều bỏ qua số nguyên tràn. Xử lý phân chia bằng không, tạo phần còn lại bằng cách sử dụng ước số bằng không và tất cả các trường hợp ngoại lệ nổi khác nhau giữa các máy và thường có thể điều chỉnh bằng chức năng thư viện . lưu ý end]

Tốt nhất là để có thể sử dụng các loại nguyên chiều rộng cố định tiêu chuẩn quy định tại <cstdint> như uint32_t.

Hãy xem tiêu đề <cerrno> quá cho các mã lỗi như EOVERFLOW. Sau đó, có các lớp học overflow_error/underflow_error từ <stdexcept>.

+0

EOVERFLOW có thể được thiết lập bởi các chức năng thư viện, nhưng nó không được thiết lập bởi các phép toán số học. –

1

Thực ra bạn thậm chí không thể phát hiện tràn tràn đáng tin cậy sau khi thực tế vì tràn trong các kết quả hoạt động số nguyên đã ký trong hành vi không xác định. Nếu trình biên dịch có thể thấy rằng một đường dẫn mã chỉ đạt được trong trường hợp tràn, nó được phép tối ưu hóa nó hoàn toàn (vì trong trường hợp hành vi không xác định nó có thể làm bất cứ điều gì cả). Các kiểu không được ký khác nhau ở chỗ chúng đã xác định các đặc tính tràn (chúng thực hiện số học modulus).

Vì vậy, cách duy nhất để phát hiện tràn với các loại đã ký là thực hiện kiểm tra thích hợp trước, điều này khá tốn kém. Nó hầu như luôn luôn hiệu quả hơn để thiết kế những thứ như vậy mà một bất biến của thuật toán của bạn đảm bảo rằng không thể có một tràn.

Đối với nguồn lực vào việc phát hiện tràn càng tốt trước khi nó xảy ra, thấy https://stackoverflow.com/a/199413/445525

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