如何使用简单的转义序列对东欧(波兰)标志进行编码?

Mic*_*ski 5 c embedded escaping misra character-encoding

我正在用C开发一个嵌入式应用程序,它必须符合MISRA标准.它将涉及使用包含波兰标志的字符串(ąęćłńśźż).我尝试使用八进制/十六进制转义序列对它们进行编码

dictionary[archive_error] = "B" "\x88" "?d pamieci";
Run Code Online (Sandbox Code Playgroud)

但规则4.1禁止这些.MISRA-C 2004.这条规则是必需的.

我的问题是:只使用ISO/IEC 9899的简单转义序列对这个字符集进行编码是否可能?

Lun*_*din 3

不清楚您使用的是哪个 MISRA 版本。

MISRA-C:2004 规则 4.1 只是禁止非标准转义序列。在 MISRA-C:2004 TC1 中,这一点后来被更改为禁止所有十六进制和八进制转义序列(除非您小心,否则它们具有实现定义的行为)。显然,这条规则及其所谓的修正是委员会的一个失误。

该规则已在最新的 MISRA-C:2012 中得到正确修复,其中规则 4.1 规定转义序列应终止,无论是新转义序列的开始还是字符串文字的结尾,就像您的示例中一样。

因此,您发布的代码不符合 MISRA-C:2004,但完全符合 MISRA-C:2012。如果您使用前者,我只是提出偏差并参考 MISRA-C:2012 规则 4.1。

否则,解决方法是简单地使用与整数混合的字符文字,而不是字符串文字:

dictionary[archive_error] = {'B', 0x88u, 'a', ... , '\0'};
Run Code Online (Sandbox Code Playgroud)

  • @MichałSzydłowski 除了 C99 支持之外,MISRA 2012 还获得了大量“修复”,例如这个。主要问题通常是您必须升级静态分析仪,这是昂贵的。至少您可以购买一份 MISRA 2012 的副本并通读它,看看您是否发现其中的其他内容可以使您的 MISRA 实施变得更容易。 (2认同)