What is wrong with this function???

最初由 老兵新手 发布
原题只是:
void func(char *p)
{
printf(p);
}
问有什么问题?

我看不出来. 就假定了这个调用:
char *s = (char *)1;
func(s);
当然, 也可以用任何数代替 1;
如果 p 是在程序地址空间内, 我看不出问题.

问题很多啊。:D:D

p 在printf()的格式化字符串的位置。

1) 如果p是一个一般字符串,那就显示那个字符串

char *s = "normal string";
func(p);

这个跟 printf("normal string");意义一样

2) 如果p是一个带特殊化字符的字符串

char *s = "un-normal %x";
func(p);

这个跟 printf("un-normal %x"); 意义一样,虽然你没有数字变量,printf()取堆栈上的相应位置数字来表示。

3) 如果p含有特殊字符,比如:

  char *s = "un-normal %s";
func(p);

这会导致printf()使用堆栈相应位置内容为指针,去读那个指针所指的内容。通常引起读写内存错

4) 如果p更本不是字符串,printf()有可能为了找到格式化字符串尾(NULL)而引起读写内存错。

5)如果p是一个非法指针,printf()在读写格式化字串时就会有读写内存错。
 
shusheng的这个应该是答案,我那个只是针对
char *s=(char *)1;
func(s);
我觉得func函数里头还是加上格式化字符会保险点
 
最初由 shusheng 发布


问题很多啊。:D:D

p 在printf()的格式化字符串的位置。

1) 如果p是一个一般字符串,那就显示那个字符串

char *s = "normal string";
func(p);

这个跟 printf("normal string");意义一样

2) 如果p是一个带特殊化字符的字符串

char *s = "un-normal %x";
func(p);

这个跟 printf("un-normal %x"); 意义一样,虽然你没有数字变量,printf()取堆栈上的相应位置数字来表示。

3) 如果p含有特殊字符,比如:

  char *s = "un-normal %s";
func(p);

这会导致printf()使用堆栈相应位置内容为指针,去读那个指针所指的内容。通常引起读写内存错

4) 如果p更本不是字符串,printf()有可能为了找到格式化字符串尾(NULL)而引起读写内存错。

5)如果p是一个非法指针,printf()在读写格式化字串时就会有读写内存错。

书生厉害. 这种解释比较合理.

谢谢了.
 
印象中,在一些黑客教程中有讲 printf就专门提到是否用格式化符,实际上是用不用都行,但是不用有安全问题。
看源码也可以看出来,至于坏指针没办法,字符串结尾符也是问题,所以最好用带n的函数。
 
后退
顶部