禁用具有不良影响的头文件
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 提供模仿泛型数学函数的宏,但宏名称与 math.h、complex.h 等头文件中的函数名称相同,对代码可读性造成不良影响,在 C11 之前编译器只能通过语言标准之外的特殊方法实现相关功能,而且参数类型与要求的类型不兼容也会导致未定义的行为。
setjmp.h、csetjmp 提供过程间跳转函数,非特定场景不应使用,详见 ID_forbidLongjmp。
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