問題タブ [strtod]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
2 に答える
349 参照

c - Newlib C 標準ライブラリ実装の strtod() と strtof() が動的メモリ割り当てを使用するのはなぜですか?

Newlib は、組み込みシステムでの使用を目的とした C 標準ライブラリの実装 (主に BSD libc に触発されたもの) です。

どうやら、文字列から浮動小数点への変換関数 ( strtod、 ) は、 を呼び出すstrtof関数 を呼び出すことによって動的メモリ割り当てを使用します。Balloc_calloc_r_malloc_r

なんで?

オンラインで公開されているソース コードを調べてみましたが、意味がわかりませんでした。

逆アセンブリでの呼び出しを見つけ、_Balloc多くの異なる入力 (文字列) を試して呼び出しをトリガーしようとしましたが、呼び出すことができませんでした。(ライブラリは事前にコンパイルされており (共有ライブラリ)、高度な最適化が行われているため、C ソース コードでプログラムをトレースすることはできません。)

などの呼び出しでいっぱいのライブラリを使用する必要があるため、strtodこれらの関数を簡単に削除することはできません。私はマイクロコントローラーにヒープを持っていません、私はマイクロコントローラーにヒープを持ちたくありません、そして私は_sbrk私のために実装された関数(最終的にヒープからメモリを割り当てる責任があります)さえ持っていません...

リンカーが失敗しないように、呼び出された場合にハードフォールトをトリガーするだけのスタブしか_sbrkありません。しかし、これは明らかにあまり良くありません。

ですから、Balloc が呼び出される理由と時期 (どのような種類の入力) を知りたいのです。私の場合、そのタイプの入力が不可能であることを証明できるかもしれないので、スタブは認可可能なハックになるでしょう。

ここに strtod.c があります: https://www.codepile.net/pile/JZVLj6yQ

編集:

_strtod_l() (これは strtod によってラップされるものです):