程序健壮性

来源:互联网 发布:淘宝店招在线生成 编辑:程序博客网 时间:2024/06/06 07:16
//腾讯QQ2008年笔试题中的附加题(30分)//从程序健壮性进行分析,下面的FillUserInfo函数和main函数分别//存在什么问题?#include <iostream>#include <string>#include <memory>#define MAX_NAME_LEN 20struct USERINFO{int nAge;char szName[MAX_NAME_LEN];};void FillUserInfo(USERINFO* parUserInfo){std::cout<<"请输入用户的个数:";int nCount=0;std::cin>>nCount;for(int i=0;i<nCount;i++){std::cout<<"请输入年龄:";//原先是这样的//std::cin>>parUserInfo[i]->nAgestd::cin>>parUserInfo[i].nAge;std::string strName;std::cout<<"请输入姓名:";std::cin>>strName;strcpy(parUserInfo[i].szName,strName.c_str());}}int main(int argc,char* argv[]){//USERINFO arUserInfos[2]={0};USERINFO arUserInfos[2];ZeroMemory(arUserInfos, sizeof(arUserInfos));FillUserInfo(arUserInfos);printf("The first name is:");printf(arUserInfos[0].szName);printf("\n");return 0;}//********************************************************************// 百度知道上某牛人给的解答:// 1:函数入口未验证.要防止FillUserInfo(USERINFO* parUserInfo)的//   参数指针是【非法指针】。//   入口验证可以这样写:ASSERT(parUserInfo);//   或://   if(parUserInfo == NULL){return;}// 2:从设计的角度来说,把数据长度的限定和数据传递值分开是非常危险的。//   比如FillUserInfo(USERINFO* parUserInfo)我传了USERINFO arUserInfos[100]//   进去,里面输入nCount的时候我输入101呢?一般来说应该FillUserInfo(USERINFO* //   parUserInfo,int nSize);传入一个需要赋值的长度参数.而且你在函数里面也无法//   计算parUserInfo的长度.// 3:将std::string赋值给【C风格字符串】是十分危险的。string是动态开辟内存,//   【长度是无限的】。如果超过C风格数组的长度即MAX_NAME_LEN很容易造成栈溢出//    或内存访问崩溃。如需这样用.请用strncpy(parUserInfo[i].szName,strName.c_str(),20);// 4:一个细节.for(int i=0;i<nCount;i++)//   虽然C++支持定义时使用,但不建议这么写。不同版本的编译器对此理解不同,不利于//   扩展和向上升级。微软建议还是用//   int i = 0 ;//   for(i=0;i<nCount;++i)// 5:USERINFO arUserInfos[100]={0};结构体赋值不建议这么做。//   有两种推荐的安全做法//   1--构造函数初始化.//   2--ZeroMemory(arUserInfos,sizeof(arUserInfos)); 调用memset置零// 6:混用printf和cout,cin也是不好的,虽然不会有危险,但是其使用不同的缓冲流可能//   存在输出顺序混乱的问题//************************************************************************//************************************************************************// 【关于c_str()函数的学习】// 1,C语言中没有string类型,C++中为了与C语言兼容,使用string类对象的//    成员函数c_str()把string对象转换成C中的字符串样式//    注意:一定要使用strcpy()函数等操作c_str()返回的指针//    原因:c_str函数的返回值是const char *的,不能直接赋值给char *//    包含的头文件:<cstring>// 2,最好不要这样写://    char *c;//    string s = "1234";//    c = s.c_str();//    //************************************************************************

0 0
原创粉丝点击