禁用不合规的头文件
3.1.6 ID_forbiddenHeader
已过时的、无意义的或有不良副作用的头文件应禁用。
示例:
#include <tgmath.h> // Non-compliant
#include <setjmp.h> // Non-compliant
#include <iso646.h> // Non-compliant in C++
#include <stdbool.h> // Non-compliant in C++
#include <ciso646> // Non-compliant in C++
#include <cstdbool> // Non-compliant in C++
#include <ctgmath> // Non-compliant in C++
#include <ccomplex> // Non-compliant in C++
#include <cstdalign> // Non-compliant in C++
tgmath.h 和 ctgmath 会使用语言标准之外的技术实现某种重载效果,而且其中的部分函数名称会干扰其他标准库中的名称,setjmp.h 和 csetjmp 则包含危险的过程间跳转函数。
iso646.h、stdalign.h、stdbool.h 以及 ciso646、cstdalign、cstdbool 等头文件对 C++ 语言没有意义,ccomplex、cstdalign、cstdbool、ctgmath 等头文件在 C++17 标准中已过时,在 C++ 代码中不应使用这些头文件。
stdio.h、signal.h、time.h、fenv.h 等头文件含有较多标准未声明或由实现定义的内容,对有高可靠性要求的软件系统也不建议使用。
审计工具不妨通过配置设定不合规头文件的名称,如:
[ID_forbiddenHeader]
inC=tgmath.h|setjmp.h
inCpp=tgmath.h|ctgmath|setjmp.h|csetjmp
表示对 C 代码将 tgmath.h、setjmp.h 设为不合规,对 C++ 代码将 tgmath.h、ctgmath、setjmp.h、csetjmp 设为不合规。
配置
inC: C 代码中不合规头文件名称
inCpp: C++ 代码中不合规头文件名称
依据
ISO/IEC 14882:2017 C.5.1(4)
ISO/IEC 14882:2017 D.4(1)-deprecated
参考
MISRA C 2012 21.4
MISRA C 2012 21.5
MISRA C 2012 21.10
MISRA C 2012 21.11
MISRA C 2012 21.12
MISRA C++ 2008 18-0-4
MISRA C++ 2008 18-7-1
MISRA C++ 2008 27-0-1