問題タブ [c99]
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 - C99コード用の無料の静的チェッカー
「これらのプリプロセッサマクロは常に定義されている」と明示的に言うことができる、C99コード(GCC拡張機能を含む)用の無料の静的チェッカーを探しています。
単一のターゲットプロセッサ用の埋め込みコードをコンパイルしているので、最後の部分が必要です。コンパイラ(MicrochipのC32、GCCベース)は、選択されたプロセッサに基づいてマクロを設定します。このマクロは、PIC32ヘッダーファイルで使用され、インクルードするプロセッサ固有のヘッダーファイルを選択します。したがって、 cppcheckは、多くの可能なPIC32プロセッサの1つを選択するために使用される30#ifdef
の異なるを検出し、これらと他のすべての可能なすべての組み合わせを分析しようとして失敗する#define
ため、失敗します。
たとえば、スプリントがC99コードを処理できる場合、私は次のように使用します。
追加の問題は、PIC32ツールチェーンコンパイラが呼び出されるpic32-gcc
だけgcc
でなく、これを説明する必要がある点にまだ到達していないことです。
アップデート#1-私が興味を持っていることの1つですが、この質問に直交しているのは、Eclipseの統合です(30以上のコンパイルユニット用のmakefileを作成する必要がないのは素晴らしいことです)。私はEclipseフォーラムでこれについて質問しました(ただし、Eclipseへの統合についてはもっと議論があります)。画期的なことは何もありません。
アップデート#2 - clangscan-build
から試してみました。
...(これも--use-cc
フラグなしで)しかし、私が得たのは典型的なビルド出力だけでした。その例は次のとおりです。
...そして最後に:
によると、私のコードは完璧であるか、scan-build
何もしていません。それが機能しているかどうかを確認するための良いテストが何であるかはわかりません。
c - 文字列をCの日時構造体に解析する方法は?
文字列(char *)をCのtm構造体に解析してもらいたいのですが、それを行うための組み込み関数はありますか?
私はC99規格のANSICを参照しています。
c - getaddrinfo を使用する静的にリンクされたバイナリを作成しますか?
が含まれているヘッダーを含めましたnetdb.h
がgetaddrinfo
、gcc は次の警告を発行します。
不足しているファイルを静的にコンパイルするにはどうすればよいですか?
可能な解決策:
glibc のインストールに、静的コンパイルに必要な対応するオブジェクト ファイルがない可能性があります。その場合は、対応するオブジェクト ファイルを作成し、コンパイル時にリンクします。
glibc の代わりに EGLIBC を試してください。
私はプログラムをdietlibcで正常にコンパイルしました。これはエラーなしでコンパイルされ、結果のバイナリはglibcが作成するものよりもはるかに小さくなりました。
c - 可変長配列
可変長配列がどのように管理されているかを知りたいです (可変長配列を持つために、どのような追加の変数またはデータ構造がスタックに保持されているか)。
どうもありがとう。
c - 主要なコンパイラ/ツールチェーンでの C99 サポートの状況は?
私がここで行ったコメントへの応答は、私を立ち止まって考えさせました:「私は、C99 サポートの状態がどうなっているのか本当に知りません.」
ウィキペディアにはいくつかのコンパイラの詳細が記載されていますが、私は C99 に精通していないため、標準のすべてのビットとピースを知ることができないため、質問に対する全体的な概要の回答を探しています。
主要なコンパイラ/ツールチェーンでの C99 サポートの状況は?
c - c99 goto 過去の初期化
クラッシュのデバッグ中に、いくつかのコードでこの問題に遭遇しました。
この問題は、最初の malloc が失敗したときに発生します。の初期化にジャンプするためp2
、ランダム データが含まれ、 への呼び出しfree(p2)
がクラッシュする可能性があります。
これが、コンパイラーが goto が初期化を越えてジャンプすることを許可しない C++ と同じように扱われることを期待/希望します。
私の質問: 標準で許可されている初期化を飛び越えていますか、それとも gcc の c99 実装のバグですか?
c - C99 は配列が連続していることを保証しますか?
別の質問の熱いコメント スレッドに続いて、C 配列に関する C99 標準で定義されているものと定義されていないものについて議論するようになりました。
基本的に、 のような 2D 配列を定義する場合int a[5][5]
、標準の C99 は、それが int の連続したブロックに(int *)a
なることを保証しますか? にキャストして、25 int の有効な 1D 配列があることを確認します。
私が標準を理解しているように、上記のプロパティは sizeof 定義とポインター演算で暗黙的ですが、他の人は同意しないようで、 (int*) へのキャストは未定義の動作を与えると言います (既存のすべての実装が実際に割り当てることに同意したとしても)連続した値)。
より具体的には、すべての次元の配列境界をチェックし、1D 配列にアクセスするときに何らかのエラーを返すように配列をインストルメント化する実装、または 1 行目より上の要素に正しくアクセスできない実装を考えるとします。そのような実装は標準に準拠できますか? この場合、C99 標準のどの部分が関連していますか。
c - ポインタ付きのva_arg
次のようなポインタ引数を使用してリンクリストを初期化したい:
問題は、でclangエラーが発生type name requires a specifier or qualifier
しva_arg(va, (struct structure *))
、型指定子がデフォルトでintになっていることです。(struct structure *)
また、およびでインスタンス化されたフォームにも注意してstruct structure *
ください。これ、割り当てられているように見えるのs
はですint (struct structure *)
。
から括弧を削除すると正常にコンパイルされます(struct structure *)
が、初期化されるはずの構造にアクセスできません。
int
かっこがva_argに渡された型引数の周りにあるのになぜ仮定されるのですか?どうすればこれを修正できますか?
c - 2次元vlaの生成は、セグメンテーション違反で終了します
昨日からコードをさらに開発し(関数内のmallocとsscanfによって引き起こされたセグメンテーション違反)、ネット上で見つけたいくつかのチュートリアルの助けを借りて、2次元のvlaを生成しようとしました。しかし、でセグメンテーション違反が発生し(*data)[i][j]=atof(p);
ます。プログラムは、テキストファイルから行列を読み取り、それを2D配列(列1〜9)および1D配列(列10)にロードすることになっています。
【サンプルコード】
[somedatafile.txtの内容]
linux - makeを使用してC99としてコンパイルする方法は?
Makefileを使用してLinuxカーネルモジュールをコンパイルしようとしています。
それは私に与えます:
C99に切り替える必要があります。読んだ後、フラグ-std = c99を追加する必要があることに気付きましたが、どこに追加するのかわかりません。
Makefileを変更してC99としてコンパイルするにはどうすればよいですか?