2015-07-30 15 views
7

Tôi đã điều sau đây:Misra-C lỗi trong cấu trúc mảng khởi

typedef struct 
{ 
    uint8_t BlockID; 
    uint32_t Copies; 
    uint16_t Size; 
}NVMM_ConfigType; 

const NVMM_ConfigType NvmmCnf_Layout[6] = 
{ 
    { 1, 1, 4}, 
    { 2, 3, 4}, 
    { 5, 5, 16}, 
    { 10, 1, 4}, 
    { 11, 2, 32}, 
    { 13, 1, 100}, 
}; 

Mà dường như tốt với tôi, nhưng, Misra-C được đưa ra các lỗi sau:

Misra C: 2012 quy tắc 10.3 vi phạm: [R] Giá trị của một biểu thức không được gán cho một đối tượng có loại thiết yếu hẹp hơn hoặc loại danh mục cần thiết khác

Tôi đã cố gắng tìm ra lý do tại sao điều này xảy ra nhưng tôi có thể nhìn thấy nó. Ngoài ra các kết quả xây dựng được cản với lỗi này trên các tình huống tương tự và tôi không biết tại sao.

Có ai biết điều gì đang xảy ra không?

EDIT: Tôi cũng đã cố gắng đúc một cách rõ ràng tất cả các giá trị và vẫn nhận được lỗi tương tự:

const NVMM_ConfigType NvmmCnf_Layout[6] = 
{ 
    { (uint8_t)1, (uint32_t)1, (uint16_t)4}, 
    { (uint8_t)2, (uint32_t)3, (uint16_t)4}, 
    { (uint8_t)5, (uint32_t)5, (uint16_t)16}, 
    { (uint8_t)10, (uint32_t)1, (uint16_t)4}, 
    { (uint8_t)11, (uint32_t)2, (uint16_t)32}, 
    { (uint8_t)13, (uint32_t)1, (uint16_t)100}, 
}; 
+0

Tôi không thấy bất kỳ vấn đề ở đây ... chắc chắn không phải WRT R10.3. Dòng nào là lỗi chống lại? – Andrew

+0

Vui lòng hiển thị phiên bản mã của bạn với loại phôi được tham chiếu trong nhận xét bên dưới, "Tôi cũng đã cố gắng truyền mọi giá trị nhưng vẫn gặp lỗi tương tự." –

+0

@Andrew: Lỗi ở dấu ngoặc mở, lỗi ngay sau "=" – m4l490n

Trả lời

1

Hmm, quy tắc đó sẽ giúp thiết 8 thanh ghi bit thực sự không thể, hoạt động như số học được thực hiện như int hoặc lớn hơn (usual arithmetic conversions). Một lý do nữa để từ chối MISRA là chuẩn mã hóa.

Tôi giả sử bạn phải truyền từng giá trị trong bộ khởi tạo cho loại trường tương ứng. Nhưng Như quy tắc được trích dẫn, đó vẫn sẽ là một sự vi phạm.

+0

Tôi cũng đã cố gắng truyền mọi giá trị nhưng vẫn gặp lỗi tương tự – m4l490n

+0

Bạn có thể giải thích lý do tại sao bạn nghĩ "quy tắc đó sẽ làm cho thiết lập đăng ký 8 bit thực sự không thể"? – Andrew

+0

@Andrew: Tôi quên mất phôi. Đủ kỳ lạ, như gcc cảnh báo về điều tương tự nếu sử dụng '-Wconversions'. Tôi sẽ sớm xóa câu trả lời, vì nó dường như không giúp ích gì và tôi không phải là chuyên gia về MISRA - tôi thực sự nghĩ đó là một bài đọc tốt cho người mới bắt đầu để tìm hiểu về những cạm bẫy, nhưng không phải là một ý tưởng hay để tôn trọng hầu hết người học nghề của nó làm. Một trình biên dịch tốt với hầu hết các cảnh báo được kích hoạt tốt hơn nhiều và cho phép một số tính linh hoạt cho lập trình viên có kinh nghiệm mà không hạn chế ;-) anh ta quá nhiều. – Olaf

4

(Xin chào, đây là một tài khoản mới vì vậy tôi không thể sử dụng phần ý kiến ​​được nêu ra để hỏi cho rõ hơn nữa, vì vậy tha thứ trả lời dài)

Để cụ thể, Quy tắc này 10,3 gắn liền với Misra-C: 2012 (tiêu chuẩn mới nhất) là một cải tiến lớn so với các phiên bản trước đó trong đó có nhiều nỗ lực hơn trong việc giải thích lý do của MISRA, cùng với nhiều ví dụ tuân thủ và không tuân thủ hơn.

Lý do của quy tắc là: vì C cho phép phân công giữa các loại số học khác nhau, việc sử dụng các chuyển đổi tiềm ẩn này có thể dẫn đến kết quả không mong muốn, với khả năng mất giá trị, dấu hiệu hoặc độ chính xác. MISRA_C: 2012 có một kiểu mẫu thiết yếu để giúp cảnh báo khi điều này có thể xảy ra.

Mô tả quy tắc cũng bao gồm ngoại lệ cho quy tắc. Đối với quy tắc 10.3, một ngoại lệ là: Một biểu thức hằng số nguyên không âm của kiểu ký tự cơ bản có thể được gán cho một đối tượng có kiểu unsigned cơ bản nếu giá trị của nó có thể được biểu diễn trong loại đó.

Không rõ dòng và cột chính xác mà công cụ của bạn đang báo cáo vi phạm (cần). Các công cụ tốt hơn cũng sẽ cung cấp thông tin chi tiết hơn về chính xác phần nào của quy tắc đang bị vi phạm (ví dụ: nếu thay vì 1, bạn có 128 trong bài tập đầu tiên với 8 bit, công cụ sẽ rất rõ ràng về điều đó).

Trong mọi trường hợp, tôi không (cũng không phải công cụ của tôi) thấy bất kỳ vi phạm nào ở đây 10.3.

Vì đây là quy tắc “đáng tin cậy”, tôi sẽ quan tâm đến công cụ nếu đây là mã quan trọng về an toàn, ngoài thực tế là nó lãng phí thời gian của bạn.

Hầu hết các công cụ đều cho phép bạn chặn cảnh báo và ghi lại lý do (trong trường hợp này là lỗi trong công cụ).

Nếu nhà cung cấp công cụ của bạn cần thêm thông tin, bạn có thể đăng câu hỏi của mình trong diễn đàn thảo luận tại http://www.misra-c.com để nhận câu trả lời chính thức và chuyển tiếp cho nhà cung cấp.

+1

Cảm ơn và tôi sẽ cho nhà cung cấp biết vì tôi nghĩ công cụ đã gặp vấn đề với MISRA-C. Nhân tiện, công cụ này là TriCore Eclipse IDE v5.0r2 từ Altium – m4l490n

+0

Như tôi đã nói, MISRA-C: 2012 là một cải tiến lớn và kết quả là nó trở thành tiêu chuẩn mã hóa C cơ sở cho các ngành công nghiệp quan trọng khác (ngoài ô tô). Tuy nhiên, tổ chức MISRA không có chương trình chứng nhận hoặc phù hợp cho các công cụ, tùy thuộc vào người dùng để tìm ra cái nào đáp ứng tốt nhất nhu cầu của họ và giúp họ điền vào ma trận tuân thủ của họ tốt nhất. – Veriloud

0

Khi tôi sử dụng PC-Lint kiểm tra quy tắc Misra, tôi thường thấy mình cần phải thêm u hậu tố để hằng:

const NVMM_ConfigType NvmmCnf_Layout[6] = 
{ 
    { 1u, 1u, 4u}, 
    { 2u, 3u, 4u}, 
    { 5u, 5u, 16u}, 
    { 10u, 1u, 4u}, 
    { 11u, 2u, 32u}, 
    { 13u, 1u, 100u}, 
}; 

này giúp loại bỏ các int để unsigned chuyển đổi.

Nếu đây là không đủ, sau đó phôi:

const NVMM_ConfigType NvmmCnf_Layout[6] = 
{ 
    { (uint8_t) 1u, 1u, (uint16_t) 4u}, 
    { (uint8_t) 2u, 3u, (uint16_t) 4u}, 
    { (uint8_t) 5u, 5u, (uint16_t) 16u}, 
    { (uint8_t)10u, 1u, (uint16_t) 4u}, 
    { (uint8_t)11u, 2u, (uint16_t) 32u}, 
    { (uint8_t)13u, 1u, (uint16_t)100u}, 
}; 
+0

Tôi cũng đã thử hai tùy chọn này và vẫn không thành công. Mọi thứ dẫn đến kết luận rằng công cụ này không hoạt động đúng. – m4l490n

+0

@Doug Đây là MISRA-C: 2012, không phải là MISRA-C: 2004. – Veriloud

+0

@Veriloud, tuyên bố của bạn là đúng, nhưng tôi không hiểu làm thế nào nó liên quan đến câu trả lời của tôi. Bạn có nói rằng việc sử dụng PC-Lint để tuân thủ MISRA-C: 2012 không có vấn đề này? –

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