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;
          }

          主站蜘蛛池模板: 永平县| 秦皇岛市| 朝阳县| 苏尼特左旗| 嵩明县| 汤原县| 毕节市| 那曲县| 哈巴河县| 石河子市| 辽宁省| 股票| 肇东市| 隆德县| 渭源县| 林周县| 荣昌县| 铁岭市| 海口市| 庆云县| 华宁县| 肥乡县| 宜州市| 高邑县| 奉化市| 崇州市| 台北县| 镶黄旗| 渑池县| 无棣县| 揭东县| 雅江县| 永胜县| 定结县| 拉萨市| 清水县| 巧家县| 三台县| 修武县| 霍山县| 长岭县|