2012-04-14 37 views
5

Tôi tìm thấy điều này trong một ứng dụng c đa luồng. Các tác giả nhận xét rằng nó được sử dụng để làm cho một vụ tai nạn thread trong một chức năng khẳng định tùy chỉnh. GCC là tốt với nó, nhưng kêu vang hành các cảnh báo sau đây:Đập chuỗi với * (int *) NULL = 1; có vấn đề?

note: consider using __builtin_trap() or qualifying pointer with 'volatile' 

và cũng phát hành một trong những, đối với từng sử dụng các chức năng khẳng định:

warning: indirection of non-volatile null pointer will be deleted, not trap 

gì đang xảy ra ở đây? Là __builtin_trap cụ thể để kêu vang? Tôi có nên sử dụng nó không?

+3

Lưu ý rằng không có sự cố nào xảy ra khi tạo sự cố luồng; bất kỳ tai nạn nào bị treo toàn bộ chương trình ... –

Trả lời

10

Viết để NULL địa chỉ không được bảo đảm để sụp đổ chương trình của bạn đáng tin cậy, vì vậy GCC introduced __builtin_trap cho điều đó.

Có vẻ như kêu vang đã quyết định đi xa hơn và loại bỏ các ghi như vậy hoàn toàn, gần như buộc bạn phải sử dụng __builtin_trap. Lựa chọn khác của họ để đúc NULL đến volatile con trỏ không trông hấp dẫn so với __builtin_trap, bởi vì nó "chỉ là" một hành vi không xác định.

+0

Điều đó nói rằng, chỉ cần thêm rằng 'dễ bay hơi' có thể là cách dễ nhất nếu bạn đang chạm vào mã được biên dịch bởi các trình biên dịch khác mà không hỗ trợ cho phần mở rộng GCC. – Yirkha

2

Tuyên bố chứng minh hành vi không xác định. Đặc biệt trình biên dịch không bắt buộc phải cố gắng lưu trữ một cái gì đó tại địa chỉ 0 và có thể tối ưu hóa điều này. Đây là những gì các trình biên dịch đang nói cho bạn.

Sử dụng exit() hoặc abort() hoặc một số dẫn xuất để chấm dứt thực hiện toàn bộ quy trình. Đây là di động. (C11 có exit, _Exit, quick_exitabort)

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