禁用 atof、atoi、atol 以及 atoll 等函数
10.6.12 ID_forbidAtox
当字符串无法被正确转为数值时,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