posts - 25, comments - 69, trackbacks - 0, articles - 2

          sprintf的問題

          Posted on 2006-11-28 18:18 壯士日志 閱讀(916) 評論(0)  編輯  收藏 所屬分類: 編程技術

          ??????今天系統莫明其妙的故障,以前用的好好的客戶信息匯總統計突然出現異常,查看日志顯示oracle的sql語句異常.
          ??????跟蹤調試后臺發現問題出現在sprintf語句上面,sql預定義 char[8000],然后用sprintf來格式化,結果當語句的數據超過8000的時候就不能正常處理了.
          ???? google了一下:

          眾所周知,sprintf不能檢查目標字符串的長度,可能造成眾多安全問題,所以都會推薦使用snprintf.

          snprintf(_snprintf)的聲明是這樣的

          int _snprintf(
          ?? char *buffer,
          ?? size_t count,
          ?? const char *format [,
          ????? argument] ...
          );

          If len < count, then len characters are stored in buffer, a null-terminator is appended, and len is returned.

          If len = count, then len characters are stored in buffer, no null-terminator is appended, and len is returned.

          If len > count, then count characters are stored in buffer, no null-terminator is appended, and a negative value is returned.


          最常見的錯誤用法有:
          1.
          char sa[256]={0};
          _snprintf(sa,sizeof(sa),"%s",sb);
          //錯誤原因:當sb的長度>=256的時候,sa將沒有'\0'結尾

          2.
          char sa[256];
          _snprintf(sa,sizeof(sa)-1,"%s",sb);
          //錯誤原因:當sb的長度>=255的時候,sa將沒有'\0'結尾,忘記給sa初始化

          3.
          char sa[256];
          _snprintf(sa,sizeof(sa)-1,"%s",sb);
          sa[sizeof(sa)]=0;
          //錯誤原因:最后一行數組越界

          正確的用法
          1. //推薦用法
          char sa[256];
          sa[sizeof(sa)-1]=0;
          _snprintf(sa,sizeof(sa),"%s",sb);
          if(sa[sizeof(sa)-1]!=0)
          {
          ?? printf("warning:string will be truncated");
          ?? sa[sizeof(sa)-1]=0;
          }

          2.
          char sa[256]={0};
          int result = _snprintf(sa,sizeof(sa),"%s",sb);
          if(result==sizeof(sa) || result<0)
          {
          ??? printf("warning:sting will be truncated");
          ?? sa[sizeof(sa)-1]=0;
          }

          主站蜘蛛池模板: 南安市| 麻栗坡县| 龙门县| 田东县| 成都市| 麦盖提县| 贵南县| 日土县| 清远市| 江门市| 湘潭县| 黄骅市| 大名县| 株洲县| 昌江| 堆龙德庆县| 澄迈县| 荃湾区| 惠来县| 黄陵县| 襄汾县| 宁波市| 石林| 鹰潭市| 台前县| 仪陇县| 屏东市| 新巴尔虎右旗| 田林县| 当阳市| 施甸县| 巴南区| 河南省| 玉山县| 仪征市| 密山市| 定州市| 贵阳市| 平原县| 东港市| 遵义市|