問題タブ [c-standard-library]
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.
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 によってラップされるものです):
c - Linux - 機能テスト マクロと動的リンク
C 標準ライブラリには、メソッド strerror_r ( https://linux.die.net/man/3/strerror_r ) が含まれています。
コンパイル時に定義された「機能テスト マクロ」、およびコンパイルと GNU 標準ヘッダーに応じて、次の 2 つの定義のいずれかが含まれます。
int strerror_r(int errnum, char buf, size_t buflen); / XSI準拠 */
char *strerror_r(int errnum, char buf, size_t buflen); / GNU固有 */
strerror_r() の XSI 準拠バージョンは、次の場合に提供されます: (_POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600) && ! _GNU_SOURCE それ以外の場合は、GNU 固有のバージョンが提供されます。
アプリケーションと標準ライブラリを動的にリンクしていると仮定すると、リンカーは関数の適切な定義とどのように正しくリンクしますか?