2016-06-07 14 views
5

Tôi đã viết một đoạn mã sau đây và phân tích qua QA C nhưng nó cho thấy cảnh báo 'x' có liên kết bên ngoài và đang được xác định mà không cần khai báo trước đó. Vui lòng giúp tôi hiểu điều này.Thông điệp cảnh báo QA C trong Mã C

Code:

#include <stdio.h> 
int x; 
void main() 
{ 
} 
+0

Cảm ơn bạn @gregor – Santz

+1

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) –

+0

QA C có được đặt để kiểm tra tính tuân thủ của MISRA hay không? – Lundin

Trả lời

5

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.

6

Tất cả những gì có nghĩa là xthể có thể truy cập ngoài các đơn vị dịch có chứa các mã trên. Vì vậy, giá trị của nó có thể được thay đổi bởi các đơn vị dịch thuật khác.

Vì vậy, trình biên dịch cảnh báo bạn về khả năng mất ổn định chương trình.

Nhưng con voi trong phòng. Khắc phục mẫu thử nghiệm không phải di động void main(). Sử dụng int main(). Khá vui lòng, với đường trên đầu.

+0

Nó không phải là một con voi, đó là một con ngựa chết ... Trong trường hợp mã OP là cho một hệ thống nhúng, định dạng này của chính là hoàn toàn tốt đẹp và di động. [Xem này] (http://stackoverflow.com/a/31263079/584518). Ngoài ra, QA C không phải là trình biên dịch mà là một trình phân tích tĩnh. – Lundin

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