問題タブ [libc]
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 - 異なる文字列ポインター/配列型での strsep セグメンテーション違反
プラットフォーム: Linux、OSX
コンパイラ: GCC
私は現在私を混乱させている単純なプログラムを持っています-私はこの問題を引き起こすためにいくつかの異なる種類の配列/ポインターをいじっていることを知っています-それは意図的です-私はそれを理解しようとしています.
リストされているコードは期待どおりにコンパイルおよび実行されますが、 or の呼び出しで変更すると、data4
セグメンテーションエラーが発生します。その理由を理解したいと思います。strsep(&data4, "e");
data1
data3
linux - 古いバージョンのlibcとリンクして、アプリケーションのカバレッジを拡大します
Linuxバイナリは通常、コアシステムライブラリ(libc)に動的にリンクされています。これにより、バイナリのメモリフットプリントは非常に小さくなりますが、最新のライブラリに依存するバイナリは古いシステムでは実行されません。逆に、古いライブラリにリンクされたバイナリは、最新のシステムで正常に実行されます。
したがって、配布中にアプリケーションが適切にカバーされるようにするには、サポートできる最も古いlibcを特定し、それに対してバイナリをリンクする必要があります。
リンクできるlibcの最も古いバージョンをどのように判断する必要がありますか?
c - C内から「ulimit -n 400」に相当する方法は?
C で記述されたプログラムを開始する前に、「ulimit -n 400」コマンドを実行して、許可されているオープン ファイルの数を増やす必要がありますが、C プログラム内から同等のことを行う方法はありますか?
つまり、そのプロセスで許可されるオープン ファイル記述子の数を増やします。(スレッドごとの制限には興味がありません。)
ulimits を設定してから、より多くのファイルを開くことができる子をフォークする必要がありますか?
もちろん、ulimit を実行するシェル ラッパーを作成してから C プログラムを起動することもできますが、洗練されていないように感じます。また、bash または sh のソース コードを grep して、そこでどのように処理されているかを確認することもできます。
関連して、多数のファイル記述子を選択する場合は、こちらを参照してください。
c - C で文字列の文字にアクセスしようとするとバス エラーが発生する
私はこのコード行を何度も使用しました (更新: string が関数のパラメーターだった場合!)、しかし、今それを実行しようとすると、バス エラーが発生します (gcc と clang の両方で)。可能な限り単純なコードを再現しています。
p ポインタを使用して文字列の 2 番目の文字を変更できないのはなぜですか?
c - math.h 関数の純粋な c バージョンを探しています (コプロセッサのサポートなし)
Cソースで静的に動作する(半)自動検証ソフトウェア(CBMC (リンク) )を使用する必要があります。浮動小数点はサポートされていますが、すべての数学関数の定義はありません。それを使って数値計算ソフトウェアをチェックできるかどうかをチェックしようとしています。
だから私はこれらの機能が必要です。コプロセッサを使用しない定義を探していmath.h
ます(例: sqrt
、pow
、剰余、tan
; int
/ float
/ double
)。
いくつかの Linux ディストリビューション (おそらく今は eglibc) に同梱されている libc でそれを探したとき、たとえばハードウェアの sqrt 関数を意味するプロセッサ組み込み関数がいくつかあるポイントに常に到達しました。
パート 1: ソフトウェア実装の検索
私が必要としているのは、次の特性を持つ数学関数をサポートするライブラリです。
- IEEE 浮動小数点がサポートされていますが、純粋に整数で動作するライブラリも素晴らしいでしょう。
- 正確さは重要な要素です。(一部の情報源に隠されている特殊なケースの既知のバグはそれほどクールではありません)。結果は、IEEE-754 に関しても正しいはずです (例: sqrt のルール)。
- コプロセッサ呼び出しを使用しません。純粋なソフトウェア。C が推奨されますが、asm でもかまいません。
これまで、さまざまな libc 実装、特に組み込みシステムに関するものを少し探してきました。これらのライブラリのほとんどは、コンパイルされたプログラムの移植性とサイズをターゲットにしていると思いますが、プロセッサ固有の命令を使用しているかどうかを判断するのは困難です。
- ** fdlibmは、一見、純粋なソフトウェア定義をいくつか持っているように見えます。これをさらに検査します。ただし、ソースにはいくつかのバグが記載されています (コードは標準ではありません)。
- ** newlibは同じ定義を持っているようです (Sun Microsystems のコードに基づく)。しかし、これらのソフトウェア バージョンが常に使用されているかどうかは、現時点でははっきりとは言えません。そのため、現時点では見られないコプロセッサ コールがいくつかある可能性があります (パート 2 を参照)。
- ** uClibcは newlibと特徴を共有しているようです。
パート 2: これらの実装の構造を理解する
これらの数学ライブラリの構造を簡単に紹介してくれませんか。さまざまなバージョン (特定のコプロセッサなど) はどのようにディスパッチされますか?
そして、ファイル名のこれらの異なる接頭辞の意味は何ですか.
e_sqrt.c
、k_sin
、s_sin
?
私にとって有用なライブラリについて教えていただければ幸いです。私はライブラリをそのまま使用することを好みますが、必要な場合は、いくつかの単一関数の実装を探して、小さなライブラリを構築することもできます。math.h で定義されているすべての関数を使用するわけではありません。
thisおよびthis SO-posts は、Java Math 実装がfdlibmに基づいている/だったと言っています。これは、このライブラリが進むべき道であるように聞こえます。私が知っておくべきこのライブラリについてもっと情報を持っている人はいますか?
次の2つを含む多くの可能性があるようです:
- glibc を使用し、ソフトウェア モードでコンパイルします。問題は、(configure で) 自動システム チェック ツールを使用できないことです。すべての情報を手動で提供する必要があります。fp コプロセッサーの使用を禁止し、simd 操作を禁止するフラグはありますか? fp-without から始める必要があり、コンパイルするとソフトフロートも使用されます。コンパイルプロセスは、多かれ少なかれホストの特定の決定に依存していると思います(アームなど)。
- fdlibm を使用します(現時点では推奨)。問題: プログラムをリンクするにはどうすればよいですか? assert のような非 libm 関数が必要ですが、インストールされている system-libm ではなく、私の fdlibm に対してリンクしたい (したがって、-nodefaultlibs は assert の使用を禁止します)。
c - libc への復帰は gdb では機能しますが、単独で実行している場合は機能しません
次の簡単なコードを使用して、libc トリックに戻ろうとしています。
興味深いことに、このプログラムを実行すると「セグメンテーション エラー」で終了しますが、gdb を使用してデバッグし、段階的に実行すると、まったく問題なく、シェルが生成されてからプログラムが終了します。誰でもこの状況に遭遇しますか?または、誰かがこれを修正する方法を教えてもらえますか? まず感謝します。私は ArchLinux カーネル:2.6.33、gcc 4.5.0 を使用しています。
c - アプリケーションの範囲外の Valgrind レポート エラーについて心配する必要はありますか?
Valgrind のmemcheck
ツールを実行すると、数十万 (またはそれ以上、Valgrind は 100K で切り捨てられるため) の小さな無効な読み取りステートメントを取得することがよくあります。
これらのステートメントは、アプリケーション (" ") の外部にある関数の呼び出しを参照してstarch
おり、 の一部であると思われますlibc
。これは私が気にする必要があるものですか?
編集
fwrite
呼び出しを変更して 1 バイトを削除すると、gzip ストリームが破損します。元のコードは次のとおりです。
編集2
私は問題を見ていると思います。私は持っていて、持っin[STARCH_Z_CHUNK]
ていませんin[STARCH_Z_CHUNK + 1]
(そして同様にout[]
)。fread
とfwrite
ステートメントの両方を で調整すると-1
、これらのステートメントが得られないように見えますが、に固有のandInvalid read of size 1
はまだ多く見られます。Invalid read of size 4
8
zlib
編集3
-g
前述のように、行番号をエラーに関連付ける再コンパイルを行っています。
しかし、私は単純な変数を実行しているだけですstrncpy
。argv[]
たとえば、次のようになります。
これにより、null で終わるargv[2]
文字列が にコピーされますがuniqTag
、valgrind
これはエラーとしてマークされます。
編集4
エラーメッセージは次のとおりです。
関連する 2 行を次に示します。valgrind は、2 行目が無効な読み取りであると言っています。
なぜならstrlen(argv[2]) + 1 > strlen(argv[2])
、これは null で終わるuniqTag
.
c - getenv() によって返された char* を解放/削除する必要がありますか?
上記は環境変数を取得するコードですが、 getenv(char*) によって返されたメモリを解放しないとメモリ リークが発生しますか? いいえの場合、理由を教えてください。
c - posix regcomp と regexec はスレッドセーフですか? 具体的には、GNU libc では?
ここで 2 つの個別の質問があります。ロックせずにマルチスレッド プログラムで正規表現を使用できますか。また、そうであれば、複数のスレッドで同時に同じ regex_t を使用できますか? Googleまたはマンページで答えが見つかりません。
c++ - memmoveは動かない
memmoveは実際にはメモリを動かしませんよね?ある領域から別の領域にメモリをコピーするだけで、これら2つの領域をオーバーラップさせることができます。このfncが非常に誤解を招く方法で呼び出される理由を知りたいので、この質問をしています。
ある場所から別の場所に何かを移動するとき、「もの」は最初の場所ではなく、別の場所でのこの操作の後にあることを私は理解しています。そして、memmoveではそのようには機能しません。私は正しいですか?