2010-10-05 30 views
11

Vì lý do kiểm tra, tôi muốn tạo ra một phân chia bằng 0 trong mã C++ của tôi. Tôi đã viết mã này:Làm thế nào để gây ra một phân chia cố ý bằng không?

int x = 9; 
cout << "int x=" << x; 
int y = 10/(x-9); 
y += 10; 

Tôi thấy "int = 9" được in trên màn hình nhưng ứng dụng không bị lỗi. Có phải vì một số tối ưu hóa trình biên dịch (tôi biên dịch với gcc)? Điều gì có thể là lý do?

+0

Tại sao bạn không sử dụng 'abort()' thay thế? Một tùy chọn khác mà không thể được tối ưu hóa đi là viết cho một con trỏ NULL. –

+0

@JanHudec Trong trường hợp của tôi, tôi cần một bộ phận cụ thể bằng 0. Đó là một mã RT nhúng và tôi muốn tái tạo hành vi của hệ thống với một loại lỗi cụ thể. Đôi khi những thứ như thế này xảy ra khi bạn điều tra lỗi trong các hệ thống nhúng. – FireAphis

Trả lời

16

Thực hiện các biến volatile. Đọc và ghi các biến dễ bay hơi được coi là có thể quan sát:

volatile x = 1; 
volatile y = 0; 
volatile z = x/y; 
+1

tôi thích điều đó .... – cateof

+1

sử dụng thông minh của ngôn ngữ –

+0

@cateof @John Cảm ơn. :) – GManNickG

14

y hiện không được sử dụng, nó sẽ được tối ưu hóa.
Thử thêm cout << y vào cuối.

Ngoài ra, bạn có thể tắt tối ưu hóa:

gcc -O0 file.cpp 
+2

Ngoài ra, tắt tối ưu hóa :) – Lagerbaer

+0

@Lager Tất nhiên :) – NullUserException

+0

Vì vậy, chỉ cần làm rõ, trong dòng nhị phân của tôi với phân chia chỉ không tồn tại vì biến không được sử dụng? – FireAphis

-1

Thông thường, một chia cho số không sẽ ném một ngoại lệ. Nếu nó được unhandled, nó sẽ phá vỡ chương trình, nhưng nó sẽ không sụp đổ.

+0

Đó là chế độ xem trung tâm của Microsoft - hầu hết các môi trường không dịch ngoại lệ máy như chia cho số không thành ngoại lệ C++ –

+1

Cũng như VC++, IIRC trên Windows chia cho 0 là mặc định là ngoại lệ SEH. –

+0

Nó đã phá vỡ chương trình và đã cho tôi một ngoại lệ không được giải quyết khi tôi biên soạn nó. –

2

Phân chia bằng 0 là hành vi không xác định. Không bị lỗi cũng là một tập hợp con thích hợp của số lượng hành vi có thể vô hạn tiềm ẩn trong miền của hành vi không xác định.

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