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

禁用 atof、atoi、atol 以及 atoll 等函数

10.6.12 ID_forbidAtox
目录 › next › previous

当字符串无法被正确转为数值时,stdlib.h 或 cstdlib 中的 atof、atoi、atol 以及 atoll 等函数会导致标准未定义的行为。

对于 C 语言应改用 strtof、strtol 等函数,对于 C++ 语言应改用标准流转换的方式。

示例:

cout << atoi("abcdefg") << '\n';        // Non-compliant
cout << atoi("100000000000") << '\n';   // Non-compliant

例中字符串“abcdefg”不表示数字,字符串“100000000000”超出了正常 int 型变量的范围,这些情况会导致标准未定义的行为。

更严重的问题是无法通过这种函数判断转换是否成功,这种不确定性也意味着代码在实现上存在缺陷。

C++ 标准流转换示例:

int foo(const char* s) {
    int v = 0;
    stringstream ss(s);
    ss >> v;
    if (ss.fail()) {              // Or use ‘!ss.eof() || ss.fail()’
        throw some_exception();
    }
    return v;
}

本例通过 ss.fail() 判断字符串前面的字符是否可以转为 int 型变量,也可通过 !ss.eof() || ss.fail() 判断字符串整体是否可以转为 int 型变量。

依据

ISO/IEC 9899:1999 7.20.1(1)-undefined ISO/IEC 9899:2011 7.22.1(1)-undefined

参考

MISRA C 2004 20.10 MISRA C 2012 21.7 MISRA C++ 2008 18-0-2
Copyright©2024 360 Security Technology Inc., Licensed under the Apache-2.0 license.