2015-04-13 13 views
5

Tôi đang phát triển một ứng dụng nhúng trong C, phải tuân theo các tiêu chuẩn MISRA. Nó sẽ liên quan đến việc sử dụng các chuỗi có dấu hiệu Ba Lan (ąęćłńśźż). Tôi đã thử mã hóa chúng bằng cách sử dụng trình tự octal/hex escape:Làm cách nào để mã hóa các dấu hiệu Đông Âu (Ba Lan) bằng các chuỗi thoát đơn giản?

dictionary[archive_error] = "B" "\x88" "ąd pamieci"; 

nhưng chúng bị cấm theo quy tắc 4.1. của MISRA-C 2004. Quy tắc này là yêu cầu .

Câu hỏi của tôi là: có thể, và làm thế nào để mã hóa bộ ký tự này bằng cách sử dụng các chuỗi thoát đơn giản của ISO/IEC 9899?

+0

Tôi không nghĩ rằng bạn có trình tự thoát cho chars như vậy (nhưng những người liên quan đến số của họ giá trị). Điều gì ngăn cản bạn sử dụng các ký tự thực tế trong chuỗi? – Jack

+0

@Jack Khi nói đến các ký tự không chuẩn vượt quá ASCII 7 bit cổ điển, bây giờ bạn gặp phải các tình huống trong đó bảng phông của trình soạn thảo văn bản và/hoặc hệ điều hành trên máy tính và/hoặc trình biên dịch và/hoặc hệ thống đích khác nhau . Nó sẽ là lý tưởng nếu tất cả họ đều sử dụng Unicode, nhưng điều này không phải luôn luôn như vậy. – Lundin

Trả lời

3

Chưa rõ bạn đang sử dụng phiên bản MISRA nào.

Quy tắc 4.1 của MISRA-C: 2004 đơn giản cấm các chuỗi thoát không chuẩn. Trong MISRA-C: 2004 TC1, điều này sau đó đã được thay đổi để cấm tất cả các chuỗi thoát thập lục phân và bát phân (chúng có hành vi được xác định thực hiện trừ khi bạn cẩn thận). Rõ ràng quy tắc này và sự điều chỉnh được cho là một chút của một cuộc tấn công từ ủy ban.

Quy tắc đã được sửa chữa chính xác trong MISRA-C mới nhất 2012, trong đó quy tắc 4.1 quy định rằng các chuỗi thoát sẽ bị chấm dứt, hoặc bắt đầu một chuỗi thoát mới hoặc kết thúc chuỗi ký tự, giống như trong ví dụ của bạn.

Vì vậy, mã bạn đã đăng không phù hợp với MISRA-C: 2004, nhưng mã này hoàn toàn phù hợp với MISRA-C: 2012. Nếu bạn đang sử dụng cái cũ, tôi chỉ muốn tăng độ lệch và tham khảo quy tắc MISRA-C: 2012 4.1.

Ngược lại, một công việc xung quanh chỉ đơn giản là sử dụng literals nhân vật trộn với số nguyên, thay vì literals chuỗi:

dictionary[archive_error] = {'B', 0x88u, 'a', ... , '\0'}; 
+0

Tôi sử dụng phiên bản 2004, bao gồm nó trong chỉnh sửa ngay bây giờ. Tôi sẽ kiểm tra điều này và đưa ra phản hồi –

+0

Được rồi, cách giải quyết của bạn có vẻ đúng, mặc dù khá tẻ nhạt khi sử dụng, nếu tôi có nhiều chuỗi rất dài. Điều đó sẽ giới thiệu nhiều mớ hỗn độn trong mã mà tôi có thể có được trên đó. Tuy nhiên, bạn đã làm cho tôi nâng cao vấn đề thay đổi các tiêu chuẩn của MISRA trong dự án. –

+2

@ MichałSzydłowski Ngoài hỗ trợ C99, MISRA 2012 cũng có rất nhiều "bản sửa lỗi" như thế này. Vấn đề chính thường là bạn phải nâng cấp máy phân tích tĩnh của mình, điều này rất tốn kém. Ít nhất bạn có thể mua một bản sao của MISRA 2012 và đọc qua nó, xem bạn có tìm thấy một số thứ khác ở đó mà sẽ làm cho việc thực hiện MISRA của bạn dễ dàng hơn. – Lundin

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