Kể từ khi các bang OP mã đã được viết bởi các kỹ sư trình biên dịch có kinh nghiệm, có thể đây là mục đích của các mã:
*(int32 *) 0 = 0;
được công nhận bởi thực hiện này C cụ thể như mã gây ra hành vi không được định nghĩa bởi tiêu chuẩn C và được biết đến với việc triển khai này là bất hợp pháp.
- Các
for (;;)
bổ sung cho biết mã này không bao giờ bị thoát. Các kỹ sư biên dịch biết rằng trình tối ưu hóa sẽ nhận ra mã này và suy luận rằng nó có thể được "tối ưu hóa", bởi vì bất kỳ chương trình nào đạt đến mã này đều được phép có bất kỳ hành vi nào, vì vậy trình tối ưu hóa có thể chọn cung cấp hành vi nếu mã không bao giờ đạt được.
này loại suy luận có thể chỉ nếu bạn có kiến thức cụ thể của hoạt động nội bộ của một thi C. Đó là điều mà một kỹ sư biên dịch có thể bao gồm trong các tiêu đề đặc biệt cho việc triển khai C, có lẽ để đánh dấu một số mã nhất định (chẳng hạn như mã sau khi gọi abort
) không bao giờ đạt được. Nó không bao giờ nên được sử dụng trong lập trình bình thường.
Ví dụ, hãy xem xét mã này:
if (a)
for (;;)
*(int 32 *) 0 = 0;
else
foo();
Trình biên dịch có thể nhận ra rằng lúc bấy giờ điều khoản được phép có bất cứ hành vi. Do đó, trình biên dịch được tự do lựa chọn hành vi của nó. Để đơn giản, nó chọn nó để có cùng một hành vi như foo();
. Sau đó, mã trở thành:
if (a)
foo();
else
foo();
và có thể được đơn giản hóa hơn nữa để:
foo();
Nguồn
2013-08-23 17:56:34
Đó là vòng lặp vô hạn lưu trữ 4 byte 0 vào vị trí 0-3. Nó trông giống như một cố ý hủy bỏ hoặc cố ý treo. –
@Habib có ofcourse Tôi biết rằng 'for (;;)' là một vòng lặp vô hạn. Phần dưới đây là phần tôi không hiểu. Xin lỗi vì sự mơ hồ. – NlightNFotis
@Curtis Tôi không nghĩ đó là một điều xấu. Điều này được viết bởi các kỹ sư biên dịch có kinh nghiệm, và nó phải ở đó vì một lý do. Việc thực hiện bất thường trong trường hợp có điều gì đó không ổn có vẻ giống như một lý do chính đáng, được đưa ra câu trả lời cho đến nay. – NlightNFotis