Công cụ này cảnh báo chính xác bạn không sử dụng thực hành lập trình kém. Tôi nghi ngờ điều này là do bạn có bộ phân tích tĩnh được thiết lập để kiểm tra việc tuân thủ MISRA-C.
Trước hết Misra-C không cho phép biến "toàn cầu", Misra-C: 2012 quy tắc 8,7:
Chức năng và các đối tượng không nên được định nghĩa với mối liên hệ bên ngoài nếu họ được tham chiếu trong chỉ trên đơn vị dịch.
Có nghĩa là biến này có thể là static
hoặc extern
.
Điều trước đây có ý nghĩa, sau này hầu như luôn luôn là thực hành lập trình rất xấu (với một vài ngoại lệ như một số biến số const
).
Bây giờ, nếu bạn có ý định có biến này extern
, sau đó có một quy tắc, đó là khả năng nguyên nhân của lỗi, Misra-C: 2012 quy tắc 8.4:
Một tuyên bố tương thích sẽ được hiển thị khi một đối tượng hoặc hàm có liên kết bên ngoài được xác định.
Có nghĩa là để tuân thủ MISRA, bạn cần phải khai báo bên ngoài extern int x
hiển thị bên trong cùng đơn vị dịch. MISRA khuyên bạn nên đặt nó trong một tập tin tiêu đề.
Cũng xin lưu ý rằng mã xấu như thế này được đánh dấu nưa theo tiêu chuẩn và có thể không hoạt động trong các phiên bản tương lai của C, xem C11 6.11.2:
6.11.2 mối liên kết của định danh
Khai báo một mã định danh có liên kết nội bộ ở phạm vi tệp mà không có static storececlass specifier là một tính năng lỗi thời.
Thậm chí nếu nó không được gắn cờ là thực hành lỗi thời bởi C, bạn vẫn luôn nên tránh các biến toàn cục và extern
, vì đó là con đường để lập trình spaghetti và mì spaghetti khớp nối chặt chẽ. Hãy xem xét một thiết kế chương trình hoàn toàn khác.
Cảm ơn bạn @gregor – Santz
Bất kỳ lý do cụ thể nào cho việc [mở lại] (http://stackoverflow.com/posts/37672587/revisions)? [Bất cứ điều gì cụ thể mà đánh dấu đã bị mất?] (Http://stackoverflow.com/q/5110055/2173917) –
QA C có được đặt để kiểm tra tính tuân thủ của MISRA hay không? – Lundin