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

禁用具有不良影响的头文件

3.1.6 ID_forbiddenHeader
目录 › next › previous

具有危险功能的、已过时或不具备实际意义的头文件应禁用。

示例:

#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
Copyright©2024 360 Security Technology Inc., Licensed under the Apache-2.0 license.