2013-02-19 35 views
2

该函数将布尔值转换为字符串。 指出可能的运行时错误。在C函数中发现错误

#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]); 
} 
+3

以下是其中一个提示:包含5个字符的字符串需要多长时间_really_? – 2013-02-19 12:36:40

+0

你最终解决了吗?实际上,它不属于这里,因为它是毫无疑问的......嗯,首先在ANSI-C中没有布尔值,其次当复制“FALSE”到缓冲区并从栈中返回指针时,分配的变量是致命的! – 2013-02-19 12:37:47

+0

Offtopic:作业标签的定义:作业是在后台执行的一个进程,或者计划在稍后执行 – banuj 2013-02-19 12:39:53

回答

11
  1. 缓冲区溢出:“FALSE”是6个字节包括空终止其strcpy会忠实地写,但这里只有空间5.
  2. 局部临时由地址从函数返回,使返回的值是不可用的(除非用NULL来测试它)。
  3. 0或1以外的值不会写入任何内容。与其他两个错误相比,这种情况很糟糕。
0
  1. 阵列结果的尺寸太短 - 它应该至少为6
  2. 阵列不应该是一个堆叠阵列。它需要是一个静态数组或一个动态分配的数组。
  3. 没有布尔类型是C.是否是typedef?
0

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

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

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