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

          sprintf的問題

          Posted on 2006-11-28 18:18 壯士日志 閱讀(921) 評論(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;
          }

          主站蜘蛛池模板: 禄劝| 雅江县| 五原县| 德庆县| 甘洛县| 龙海市| 金堂县| 金寨县| 油尖旺区| 开化县| 大邑县| 兴宁市| 蕲春县| 甘孜县| 增城市| 泾川县| 武川县| 马鞍山市| 枣阳市| 宣恩县| 南陵县| 虎林市| 青河县| 红河县| 诸暨市| 新河县| 永胜县| 高平市| 屏山县| 济南市| 宁海县| 乌鲁木齐市| 北碚区| 龙南县| 尼玛县| 谢通门县| 商都县| 灵丘县| 宁乡县| 徐闻县| 察雅县|