☰
  • 首页
  • 规则分类
  • 项目介绍
search
•••

避免出现 trigraph sequences

3.7.1 ID_literal_trigraphs
目录 › next › previous

由于少数键盘无法输出所有 C/C++ 标准字符,C/C++ 语言允许使用 trigraph sequences 代替无法输出的字符,但可能会导致意外的结果,且可读性较差,已从 C++17 标准中移除。

Trigraph sequence 由两个问号和另一个特定字符组成:

??=  #      ??)  ]      ??!  |
??(  [      ??'  ^      ??>  }
??/  \      ??<  {      ??-  ~

如 ??= 替代 #,??- 替代 ~。

示例:

int main(void) {
    printf("what??!\n");    // Non-compliant
}

如果启用 trigraph sequences,编译器会在词法分析之前完成替换,与问号相关的字符组合可能会与预期不符,示例代码将输出“what|”而不是“what??!”。

应改为:

int main(void) {
    printf("what\?\?!\n");   // Compliant
}

相关

ID_forbidDigraphs

依据

ISO/IEC 9899:1999 5.2.1.1 ISO/IEC 9899:2011 5.2.1.1 ISO/IEC 14882:2003 2.3 ISO/IEC 14882:2011 2.4 ISO/IEC 14882:2017 C.4.1

参考

MISRA C 2004 4.2 MISRA C 2012 4.2 MISRA C++ 2008 2-3-1 SEI CERT PRE07-C
Copyright©2024 360 Security Technology Inc., Licensed under the Apache-2.0 license.