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

避免依赖由实现定义的行为

1.17 ID_implementationDefinedFunction
目录 › next › previous

语言标准允许程序的某些行为可由编译器自行定义,这种行为称为由实现定义的行为(implementation-defined behavior),虽然有文档支持,但也会增加移植或兼容等方面的成本。

示例:

  • cstdlib、stdlib.h 中的 abort、exit、_Exit、quick_exit、getenv、system 等函数
  • ctime、time.h 中的 clock 等函数
  • csignal、signal.h 中的 signal 等函数

这些函数的行为取决于编译器、库或环境的生产厂家,同一个函数不同的厂家会有不同的实现,故称这种函数的行为是“由实现定义”的。有高可靠性要求的软件系统应避免使用这种函数,否则需明确各种实现上的具体差异,增加了移植、发布以及兼容性等多方面的成本。

#include <cstdlib>

void foo() {
    abort();   // Non-compliant
}

调用 abort 函数会终止进程,但打开的流是否会被关闭,缓冲区内的数据是否会写入文件,临时文件是否会被清理则由实现定义。

相关

ID_undefinedBehavior ID_unspecifiedBehavior

依据

ISO/IEC 9899:2011 7.14.1.1(3)-implementation ISO/IEC 9899:2011 7.22.4.1(2)-implementation ISO/IEC 9899:2011 7.22.4.4(5)-implementation ISO/IEC 9899:2011 7.22.4.5(2)-implementation ISO/IEC 9899:2011 7.22.4.6(2)-implementation ISO/IEC 9899:2011 7.22.4.7(4)-implementation ISO/IEC 9899:2011 7.22.4.8(3)-implementation ISO/IEC 9899:2011 7.27.2.1(3)-implementation

参考

CWE-474 CWE-589 MISRA C 2004 20.8 MISRA C 2004 20.11 MISRA C 2004 20.12 MISRA C 2012 21.5 MISRA C 2012 21.8 MISRA C 2012 21.10 MISRA C++ 2008 18-0-3 MISRA C++ 2008 18-0-4 MISRA C++ 2008 18-7-1
Copyright©2024 360 Security Technology Inc., Licensed under the Apache-2.0 license.