Menu

#82 auto_snprintf修正

closed
nobody
None
5
2012-11-09
2009-09-21
syat
No

"util/string_ex.h"のなかで、auto_snprintfが定義されていて、ずっと追っていくと最終的に vsprintf_s/vswprintf_s を呼んでいます。
sprintf_s も snprintf も似た様なもの、と思われるかもしれませんが、出力に対しバッファが足りない場合の挙動が違います。
オンラインのMSDNを見ると、_sのほうは「バッファが小さすぎて出力テキストを格納できない場合、バッファは、空の文字列に設定され」るとあります。
snのほうは、_TRUNCATEフラグを指定した場合、「終端の null 用の空きを残して buffer に収まる限りの文字列を書き込みます。」

何が言いたいのかというと、後者のようにバッファに詰めれるだけ詰めるsprintfが欲しいのですが、現状の auto_snprintfだと期待した動作にならないので、動作を変更したい、ということです。
すでにauto_snprintfを使っている部分への影響も心配ですが、vsnprintf_sがVC依存してて、他のコンパイラでエラーにならないかが気になっています。

Discussion

  • syat

    syat - 2009-09-21
     
  • ryoji

    ryoji - 2009-09-25

    関数名から想像して終端処理もsnprintf相当になっているほうが
    紛らわしくなくていいかな?、と思います。
    現状の使用箇所はANSI版でsnprintfだった箇所だと思いますし。
    ・auto_snprintfはvsnprintfベースにする
    ・必要ならvsnprintf_sベースのauto_snprintf_sを追加
    とするのは、難しいのかな。。。

    -----
    個人的にはすなおに直接、標準Cライブラリ関数を叩きたいのだけど。
    通常はsntprintfを使い、引数の型次第でsnprintf, snwprintfも使い分け。
    "%ts"は無理に使わなくても"%s"と等価ですよね。
    (^^;;;

     
  • syat

    syat - 2009-09-27

    ちなみにC99に準拠していると称するgccのsnprintfは
    結果がバッファ長を超える場合、末尾に¥0を設定し、
    戻り値は、バッファが十分だった場合の結果文字数です。
    (VCの _snprintf だと、¥0を設定せず、-1を返す)
    http://www.linux.or.jp/JM/html/LDP_man-pages/man3/printf.3.html

    どう倒しても紛らわしいので、
    ・VCの _snprintf に対応する auto関数は提供しない。
    ・今の auto_snprintf は auto_snprintf_s に変名。
     挙動は末尾に¥0を設定し、-1を返す。
    というのはどうでしょう?
    末尾に¥0を付けたくない需要はめったに無いと思うし、
    (あるならコメント付で_snprintfを使ってもらう)
    不注意な人(=私)が¥0付け忘れる可能性のほうが
    高いような気がするので。

    "%ts"は無理に使わなくても"%s"と等価ですよね。
    TCHAR=ACHARなら"%s"と等価、
    =WCHARなら”%ls"と等価、だったと思います。
    snとsnwの違いはフォーマット文字列と結果文字列の型だけかと。

    #ifdef _UNICODE で書き分けるというのもありですが、
    その前にANSIビルドの存在意義について小一時間(ry

     
  • syat

    syat - 2009-10-14

    auto_snprintf_s関数追加。auto_snprintfを読んでいた部分を修正。

     
  • syat

    syat - 2009-10-14

    末尾に\0を付ける auto_snprintf_s関数を作り、
    auto_snprintfを呼んでいたところは _sを呼ぶように
    修正しました。

    Fix_auto_snprintf_U2.patch

     
  • syat

    syat - 2009-10-14

    フィールドの切れ目でバッファを使い切ると、フォーマット文字列が残っていても切り詰めと判定されないバグを修正

     
  • syat

    syat - 2009-10-14

    バグがあったので修正します。
    内容:フィールドの切れ目でバッファをちょうど
    使い切ると tchar_vsprintf_s_imp のwhileループを
    抜けてしまい、まだ出力すべきものが残っていても
    切り詰め(-1)と判断されなかった。

    Fix_auto_snprintf_U3.patch

     
  • syat

    syat - 2009-10-27

    リビジョン1672でコミットしました。

     

Log in to post a comment.

Want the latest updates on software, tech news, and AI?
Get latest updates about software, tech news, and AI from SourceForge directly in your inbox once a month.