2014-10-17 15 views
9

Tôi rất mới với hạt nhân Linux. Và tôi đang sử dụng công cụ thưa thớt để làm sạch nhiễu hiện diện trong mã. Tôi đã gặp các macro này:mục đích của macro tiền xử lý được xác định trong tệp linux/compiler.h là gì?

# define __user  __attribute__((noderef, address_space(1))) 
    # define __kernel __attribute__((address_space(0))) 
    # define __safe  __attribute__((safe)) 
    # define __force __attribute__((force)) 
    # define __nocast __attribute__((nocast)) 
    # define __iomem __attribute__((noderef, address_space(2))) 
    # define __must_hold(x) __attribute__((context(x,1,1))) 
    # define __acquires(x) __attribute__((context(x,0,1))) 
    # define __releases(x) __attribute__((context(x,1,0))) 
    # define __acquire(x) __context__(x,1) 
    # define __release(x) __context__(x,-1) 
    # define __cond_lock(x,c) ((c) ? ({ __acquire(x); 1; }) : 0) 
    # define __percpu __attribute__((noderef, address_space(3))) 

Và bây giờ tôi muốn biết: cách chúng được sử dụng thưa thớt để báo cáo lỗi/cảnh báo?

Câu hỏi của tôi:

  1. Tôi muốn các chi tiết làm thế nào họ giúp trình biên dịch và thưa thớt để báo cáo cảnh báo.
  2. Những trường hợp này là address_space (x)ngữ cảnh (X, x, x) và có mục đích gì?
  3. mục đích __nocast, __force, __user, __safe là gì?

Trả lời

4

Tôi nghĩ rằng tất cả các macro chỉ có ý nghĩa trong bối cảnh sparse (manpages here - Bạn có thể tìm thấy các mô tả của tất cả những thuộc tính này và cảnh báo thưa thớt ở đó). Nếu bạn xem qua tệp nguồn bạn đã sao chép, có macro lớn __CHECKER__ được sử dụng để bật chúng.

Tôi không chắc chắn nếu gcc bất cứ điều gì với họ vào thời điểm này - Tôi nghĩ rằng nó loại âm thầm bỏ qua chúng ... Trong một e-mail của mình trở lại vào năm 2004 Linus Torvalds đã nói rằng:

Điều quan trọng cần nhớ: đối với gcc, chú thích thưa thớt là vô nghĩa. Chúng vẫn có thể hữu ích chỉ để nói cho các lập trình viên rằng "này, con trỏ bạn nhận được không phải là con trỏ bình thường" theo cách có thể đọc được, nhưng cuối cùng, trừ khi bạn sử dụng thưa thớt, chúng không thực tế là làm mọi thứ.

Có một số vé được mở cho mục đích này - http://www.spinics.net/lists/linux-sparse/msg03366.html.

+1

Cảm ơn bạn đã chia sẻ bài viết. Nhưng tôi vẫn không thể tìm ra câu trả lời như thế nào giúp nó thưa thớt để báo cáo vấn đề này. Tôi vẫn chưa nhận được how'address_space (num) 'thực sự đang giúp giải quyết và báo cáo cảnh báo. Tương tự 'ngữ cảnh (x, x, x)'. –

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