2013-01-16 26 views
6

Sau khi thực hiện thao tác toán học, giả sử nhân hai số nguyên, có thể truy cập đăng ký cờ tràn trong CPU với C++ không? Nếu không phải là những cách nhanh khác để kiểm tra tình trạng tràn là gì?Có thể truy cập đăng ký cờ tràn trong CPU với C++ không?

+2

Kiểm tra http://stackoverflow.com/questions/199333/best-way-to-detect-integer-overflow-in-cc – acrilige

+0

@acrilige thanks ,, rằng trả lời phần thứ hai của câu hỏi của tôi, bất kỳ ý tưởng nào về cách kiểm tra tràn sau SAU thực hiện các phép tính? –

+0

Vì những lý do hiển nhiên, không thể truy cập trực tiếp vào thanh ghi cờ tràn theo cách tiêu chuẩn, di động. Tuy nhiên, bạn có thể xác định xem một hoạt động sẽ tràn với một công việc nhỏ hay không, và có nhiều cách để kiểm tra điều này hoặc phát hiện tràn trong một cách không theo tiêu chuẩn không di động. –

Trả lời

6

Không, nói chung là không thể. Một số CPU thậm chí không có cờ như vậy (ví dụ: MIPS).

link được cung cấp trong một trong các nhận xét sẽ cung cấp cho bạn các ý tưởng về cách bạn có thể thực hiện kiểm tra tràn.

Hãy nhớ rằng trong C và C++ đã ký số nguyên tràn gây ra hành vi không xác định và hợp pháp bạn không thể thực hiện kiểm tra tràn sau khi thực tế. Bạn cần phải sử dụng số học chưa ký hoặc thực hiện kiểm tra trước khi thực hiện phép tính số học.

4

Tôi khuyên bạn nên đọc sách này trong mọi trường hợp thích hợp. Từ Optimizing software in C++ -

Lỗi tràn là một vấn đề bảo mật khác. Tiêu chuẩn C chính thức nói rằng hành vi của các số nguyên đã ký trong trường hợp tràn là "không xác định". Điều này cho phép trình biên dịch bỏ qua tràn hoặc giả định rằng nó không xảy ra. Trong trường hợp của trình biên dịch Gnu, giả định rằng tràn số nguyên đã ký không xảy ra có kết quả không may là rằng nó cho phép trình biên dịch tối ưu hóa việc kiểm tra quá tải . Có một số biện pháp khắc phục có thể xảy ra đối với vấn đề này: (1) kiểm tra tràn trước khi xảy ra, (2) sử dụng số nguyên không dấu - chúng được đảm bảo quấn quanh, (3) số nguyên bẫy tràn với tùy chọn -ftrapv, nhưng điều này cực kỳ không hiệu quả, (4) nhận được cảnh báo trình biên dịch để tối ưu hóa như vậy với tùy chọn -Wstrict-overflow=2 hoặc (5) làm cho hành vi tràn được xác định rõ ràng với tùy chọn .

0

Đây có lẽ không phải những gì bạn muốn làm vì hai lý do:

  1. không phải mọi CPU có một lá cờ tràn
  2. sử dụng C++ có thực sự là không có cách nào để truy cập vào cờ tràn

mẹo kiểm tra tràn mà mọi người đã đăng trước đây có thể hữu ích.

nếu bạn thực sự muốn viết rất nhanh mã nhân hai số nguyên và kiểm tra cờ tràn, bạn sẽ phải sử dụng assembly. nếu bạn muốn một số ví dụ cho x86, thì hãy yêu cầu

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