分类:
2008-10-13 16:10:37
作者: 2007年12月28日
先看代码:
char buf [20];
strcpy(buf, "abcdefghijklmnopqrstuvwxyz");
呵呵,只有两行,单独看都没错,合起来就麻烦了。
是的,buf的长度只有20字节,无法容纳一个26字符还要外带一个'\0'结尾的字符串。
这个拷贝操作将导致内存写操作越界,从而破坏其他地方的数据。
这并不是一个很难发现的错误,但是当buf的定义和拷贝的时机相隔很远,或者频繁使用了strcat一类函数而忽视了字符串长度的时候,想要找出这个问题,还是比较麻烦的。
解决方法有几种,最简单的就是定义足够大的缓冲区,比如当拷贝路径的时候,使用MAX_PATH宏。但是这有时候不太现实。
我们也可以使用一个string类来管理,比如MFC的CString,或者STL的std::string,都可以,当增长的时候只要调用operator +就可以了。
还有一个方式是使用strncpy,强制每次拷贝都输入一个长度参数。当然,这个参数的数值一般是buf的长度减1,buf的最后一个字节,则在初始化的时候就应该赋值为'\0'。这可以避免很多问题,但是遇到strcat的时候仍旧会有潜在危险,你可以考虑使用strncat,虽然这会带来额外的复杂性。