2

此函数将布尔值转换为字符串。指出可能的运行时错误。

#define TRUE  1
#define FALSE 0

char* bool2Str(boolean x)
{
char result[5];

if (x == TRUE)
strcpy(result, "TRUE");

if (FALSE == x) 
strcpy(result, "FALSE");

return &(result[0]);
}
4

3 回答 3

11
  1. 缓冲区溢出:“FALSE”是 6 个字节,包括strcpy将尽职地写入的空终止符,但只有 5 个空间。
  2. 本地临时由函数的地址返回,使返回的值不可用(除了我想针对 NULL 测试它)。
  3. 0 或 1 以外的值根本不会写入任何内容。与其他两个错误相比,这相形见绌。
于 2013-02-19T12:37:35.250 回答
0

好吧,如果调用者使用不同的布尔值调用它两次,第二次调用将覆盖第一次调用的结果,因为它是同一个变量(如果它是静态的)。

但是,该变量结果不是静态的,因此被调用者尝试返回一个指向局部变量的指针,该变量将在纳秒内超出范围,这通常是运行时错误/错误的良好来源。

另外,如果我是对的(不是 C 大师......),strcpy (result,"FALSE")复制六个字节到resultwhileresult只能容纳五个元素(索引 0 到 4)。

于 2013-02-19T12:41:26.277 回答
0
  1. 数组结果的大小太短 - 它至少应该是 6
  2. 该数组不应是堆栈数组。它需要是静态数组或动态分配的数组。
  3. 没有布尔类型是 C。这是 typedef 吗?
于 2013-02-19T12:38:29.903 回答