2011-07-23 9 views
1

mallocを決して呼び出さないことを保証するsnprintの変種が必要です。
このsnprintf(safe_snprint()と呼ぶ)は、mallocが失敗またはデッドロックする場所から
に呼び出されるためです。mallocを呼び出すsnprintf、またはmallocを呼び出さないsnprintf

真実、1または2に近いものは何ですか?

  1. Windowsでは、ネイティブのsnprintfがmallocを呼び出すことがあります。次に
    私はopensource snprintf.cをpullしてsafe_snprintf()と呼ぶ必要があります。または

  2. Windowsネイティブsnprintでは、mallocを絶対に呼び出さないことが保証されています。

どこかに記載されていれば(2)が好きです。ありがとう

+0

現時点で私の前にMSVCソースがありませんが、なぜ、snprintfが割り当てを行う必要があるのか​​はわかりません。実行する必要があるのは、スタックベースのメモリだけを使用して行うことができます。 –

答えて

4

VCライブラリ(MSVCRT)の_snprintf()の実装では、フォーマット精度が163文字を超える場合に限り、浮動小数点変換でmallocが呼び出されます(iff)。これは、%E%A%e%gおよびのフォーマット指定子に適用されます。

この少なくともバージョン6

+0

%162fを最大で使用しているため、これは良いお知らせです。 – Andrei

0

snprintf()がmalloc()を呼び出すべき理由はありません。期間。

しかし、ソースを表示しないとわからないことがあります。それでも、あなたはそれがこのようにとどまることは確信できません。

自分でsnprintf()を実装するよりも絶対に確実にする必要がある場合は、

+0

snprintf()は事前割り当てメモリで動作します。それはそれ自身の記憶を必要としません。私は実際にmalloc()をなぜ呼び出すのか想像できません。しかし、なぜあなたは痕跡を作ってみませんか? int main(void){char buff [512]; snprintf(buff、512、 "%d%s"、10、 "lala"); }とトレースプログラムはあなたに真実を示すことができます。 – ckruse

+0

これは、特定の小さな&シンプルなフォーマット指定子を1つだけカバーします。ユーザーが長い文字列120kを印刷するとどうなりますか?通話で%$指定子が使用される場合はどうなりますか?ユーザーが%*。*指定子を使用するのは何ですか?ソースにアクセスする必要があります。 – Andrei

1

私はインナーmallocコールに理由があるかもしれない窓snprintf実装が、this link状態に応じてドキュメントを見つけることができませんので、MSVCRTのすべてのリリースに適用されるべきです。また、どの標準でも開発者がそれを使用することを禁止するようには考えていません。ですから、私は最初のアプローチを使用することをお勧めします。 Heresnprintfの実装のリストが見つかりました。

関連する問題