タグ付けされた質問 「gcc」

GCCはGNUコンパイラコレクションです。Linux上のC、C ++、Go、Fortran、Adaの事実上の標準コンパイラであり、他の多くの言語やプラットフォームもサポートしています。コンパイラとは別に、GCCにはいくつかのプラットフォームやシステムで広く使用されているツールチェーン(libc、libstdc ++、objdump、nmなど)があります。

5
gccの__attribute __((packed))/ #pragma packは安全ではありませんか?
Cでは、コンパイラーは構造体のメンバーを宣言された順序でレイアウトし、メンバー間に、または最後のメンバーの後に挿入される可能性のある埋め込みバイトを使用して、各メンバーが適切に配置されるようにします。 gccは言語拡張を提供します__attribute__((packed))。これは、パディングを挿入しないようにコンパイラーに指示し、構造体メンバーを誤って調整できるようにします。たとえば、システムが通常すべてのintオブジェクトに4バイトアラインメントを必要とする場合、構造体メンバーが奇数のオフセットに割り当てられる__attribute__((packed))可能性がありintます。 gccドキュメントの引用: 「packed」属性は、「aligned」属性でより大きな値を指定しない限り、変数または構造体フィールドが可能な限り最小のアライメントを持つことを指定します。変数には1バイト、フィールドには1ビットです。 コンパイラーは(一部のプラットフォームでは)一度に1バイトずつ誤って配置されたメンバーにアクセスする必要があるため、この拡張機能を使用すると、データ要件は小さくなりますが、コードは遅くなります。 しかし、これが安全でないケースはありますか?コンパイラーは常に、パックされた構造体の誤って配置されたメンバーにアクセスするための正しい(低速ですが)コードを生成しますか?すべての場合にそれを行うことは可能ですか?
164 c  gcc  pragma-pack 

5
なぜこのループは「警告:反復3uが未定義の動作を呼び出す」ので、4行以上出力するのですか?
これをコンパイルする: #include <iostream> int main() { for (int i = 0; i < 4; ++i) std::cout << i*1000000000 << std::endl; } そしてgcc次の警告を生成します: warning: iteration 3u invokes undefined behavior [-Waggressive-loop-optimizations] std::cout << i*1000000000 << std::endl; ^ 符号付き整数オーバーフローがあることを理解しています。 iオーバーフロー操作によって値が壊れるのはなぜですか。 私は答えを読んだのはなぜ無限ループ原因GCCとのx86上でオーバーフロー、整数のでしょうか?、しかし、なぜこれが起こるのかはまだはっきりしていません-「未定義」は「何かが起こる可能性がある」という意味ですが、この特定の動作の根本的な原因は何ですか? オンライン:http : //ideone.com/dMrRKR コンパイラ: gcc (4.8)

1
gccコマンドラインを使用して.cファイルから.soファイルをビルドする
Linuxダイナミックライブラリ(.soファイル)のHello Worldプロジェクトを作成しようとしています。だから私はファイルhello.cを持っています: #include <stdio.h> void hello() { printf("Hello world!\n"); } hello()コマンドラインからgccを使用して、エクスポートする.soファイルを作成するにはどうすればよいですか?
162 c  linux  gcc  shared-libraries 

14
Mojaveへのアップグレード後、MacでCプログラムをコンパイルできません
端末でgccコマンドを使用してCプログラムをコンパイルしましたが、突然、Mac OS(macOS 10.14 Mojave、およびXCode 10.0)にアップデートした後、次のメッセージの受信を開始しました。 test.c:8:10: fatal error: stdio.h: No such file or directory #include <stdio.h> ^~~~~~~~~ compilation terminated. 私はそれを見つけることができるのですでにgccをインストールしていて/usr/local/bin、そこには本当にgccがあります。他のiMacでも同じファイルを実行してみましたが、問題なく動作しました。 実行xcode-select --installしてみましたが、すでにインストールされていたため、現在の問題は解決しませんでした。gccこの問題を解決するために他のリソースからいくつかのコマンドをコピーして貼り付け始めた後、パスが見つからないように見えるため、パスがめちゃくちゃになっていると思います。 これについていくつかの助けが欲しいのですが。
159 c  macos  gcc  terminal 

3
LD_LIBRARY_PATHとLIBRARY_PATH
単純なC ++プログラムを構築しています。開発とテストのために、システム提供の共有ライブラリを一時的に最新バージョンのライブラリに置き換えたいと考えています。 LD_LIBRARY_PATH変数を設定しようとしましたが、リンカー(ld)は次のエラーで失敗しました: / usr / bin / ld:-lyaml-cppが見つかりません ld manページによると、私はそれが機能することを期待していました: リンカーは次の検索パスを使用して、必要な共有ライブラリを見つけます。...ネイティブリンカーの場合、環境変数「LD_LIBRARY_PATH」の内容... 次に、LIBRARY_PATHを設定してみましたが、うまくいきました。 GCCマニュアルによると: LIBRARY_PATHの値は、PATHによく似た、コロンで区切られたディレクトリのリストです。ネイティブコンパイラとして構成されている場合、GCCは、GCC_EXEC_PREFIXを使用してそれらを見つけることができない場合、特別なリンカーファイルを検索するときに指定されたディレクトリを試みます。GCCを使用したリンクでも、-lオプションの通常のライブラリを検索するときにこれらのディレクトリが使用されます(ただし、-Lで指定されたディレクトリが最初に来ます)。 (GCC)マニュアルに示されているように、GCCとリンクしているため、LIBRARY_PATHが機能します。 だが.. エラーメッセージが示唆するように、私はgccとリンクしているので、なぜldが呼び出されていますか? 2つの変数が同じ目的を果たしている意味は何ですか?他に違いはありますか?
159 gcc  g++  ld 

3
関数宣言はプロトタイプではありません
私が作成したライブラリがあります。 mylib.c: #include <mylib.h> int testlib() { printf("Hello world\n"); return (0); } mylib.h: #include <stdio.h> extern int testlib(); 私のプログラムでは、このライブラリ関数を呼び出そうとしました: myprogram.c: #include <mylib.h> int main (int argc, char *argv[]) { testlib(); return (0); } このプログラムをコンパイルしようとすると、次のエラーが発生します。 myprogram.c:1からインクルードされたファイル mylib.h:2警告:関数宣言はプロトタイプではありません 私が使用しています: gcc (GCC) 3.4.5 20051201 (Red Hat 3.4.5-2) 私の質問は、関数プロトタイプを宣言する適切な方法は何ですか?
158 c  gcc 

9
値を返さずに非void関数の最後をオフにしても、コンパイラエラーが発生しないのはなぜですか?
私が何年も前に気付いて以来、これはデフォルトではエラーを生成しない(少なくともGCCでは)ことを知っているので、私はいつもその理由を疑問に思っていましたか? コンパイラフラグを発行して警告を生成できることを理解しましたが、常にエラーである必要はありませんか?非void関数が値を返さないのが有効であることはなぜ意味があるのですか? コメントでリクエストされた例: #include <stdio.h> int stringSize() { } int main() { char cstring[5]; printf( "the last char is: %c\n", cstring[stringSize()-1] ); return 0; } ...コンパイルします。
158 c++  c  gcc  g++ 

24
Cに役立つGCCフラグ
設定を越えて-Wall、設定-std=XXX、その他の本当に便利な、あまり知られているコンパイラフラグは、Cでの使用のために何がありますか? 偶発的なタイプの不一致を完全に最小限に抑えるために、追加の警告や、場合によっては警告をエラーに変換することに特に興味があります。
157 c  gcc  compiler-flags 



5
拡張GCC 6オプティマイザが実用的なC ++コードを壊すのはなぜですか?
GCC 6には新しいオプティマイザ機能があります。それthisは常にがnull ではないことを想定し、それに基づいて最適化します。 値の範囲の伝播は、C ++メンバー関数のthisポインターがnullでないことを前提としています。これにより、一般的なnullポインターチェックが不要になりますが、一部の非準拠コードベース(Qt-5、Chromium、KDevelopなど)も破損します。一時的な回避策として、-fno-delete-null-pointer-checksを使用できます。間違ったコードは、-fsanitize = undefinedを使用して識別できます。 変更文書は、頻繁に使用される驚くべき量のコードを破壊するため、これを危険だと明確に呼んでいます。 なぜこの新しい仮定が実用的なC ++コードを壊すのでしょうか?不注意または知識のないプログラマーがこの特定の未定義の動作に依存する特定のパターンはありますか?if (this == NULL)不自然なため、誰も書いていないようです。


2
gccのffast-mathは実際に何をしますか?
gccの--ffast-mathフラグを使用すると、浮動小数点演算の速度が大幅に向上し、IEEE標準の範囲外になることを理解していますが、オンになっているときに実際に何が起こっているかについての情報を見つけることができません。誰かが詳細のいくつかを説明して、フラグがオンまたはオフの場合に何かがどのように変化するかについての明確な例を示すことができますか? 同様の質問についてSOを掘り下げてみましたが、ffast-mathの仕組みを説明するものは何も見つかりませんでした。

6
if elseステートメントにおけるGCCの__builtin_expectの利点は何ですか?
#define彼らが使用しているに出会いました__builtin_expect。 ドキュメントは言う: 組み込み関数: long __builtin_expect (long exp, long c) __builtin_expectコンパイラーに分岐予測情報を提供するために使用できます。-fprofile-arcsプログラマーはプログラムが実際にどのように機能するかを予測することで悪名高いため、一般に、これには実際のプロファイルフィードバックを使用することをお勧めします()。ただし、このデータを収集するのが難しいアプリケーションがあります。 戻り値はの値でexpあり、整数式でなければなりません。組み込みのセマンティクスは、それが期待されていること exp == cです。例えば: if (__builtin_expect (x, 0)) foo (); ゼロになることfooを期待xしているため、を呼び出すことを期待していないことを示します。 だから直接使用しないのはなぜですか: if (x) foo (); 複雑な構文の代わりに__builtin_expect?
144 c  linux  gcc  built-in 

11
古いCコンパイラの使用はセキュリティリスクですか?
私たちには、誰も気にしないいくつかのビルドシステムが本番環境にあり、これらのマシンはGCC 3やGCC 2のようなGCCの古いバージョンを実行しています。 そして私はそれをより新しいものにアップグレードするよう経営陣を説得することはできません:彼らは「壊れていなければそれを修正しないでください」と言います。 私たちは非常に古いコードベース(80年代に書かれた)を維持しているため、このC89コードはこれらのコンパイラーで問題なくコンパイルされます。 しかし、私はこれらの古いものを使うのが良い考えだとは思いません。 私の質問は: 古いCコンパイラを使用すると、コンパイルされたプログラムのセキュリティが低下する可能性がありますか? 更新: 同じコードがVisual Studio 2008 for Windowsターゲットによってビルドされ、MSVCはまだC99またはC11をサポートしていません(新しいMSVCがサポートしているかどうかはわかりません)。最新のGCCを使用してLinuxボックスでビルドできます。したがって、新しいGCCをドロップするだけで、おそらく以前と同じように正常にビルドされます。
139 c  security  gcc 

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.