知らなかった。メモメモ。 http://gcc.gnu.org/onlinedocs/gcc-4.1.0/gcc/Atomic-Builtins.html#Atomic-Builtins
Jan Karaがなかなか素敵なバグを報告している。 bitfieldいじるときに、64bit load/store使えうように、となりのbitfieldも合わせて read-modify-write するから全然関係ないフィールド更新時に別のフィールドがlostするって・・・ でいつものようにGCC界隈から「Cの規格書にはやっちゃダメとは書いてない」という声が飛んできて カーネル界隈から「そんなんソフトが書けるか。あほー」という怒号が飛び交う展開に だって、普通たまたま隣り合ってるだけの全然関係ないフィールドってロックも別だよねえ(-_-;) From: Jan Kara jack@suse.cz vger.kernel.org To: LKML Cc: linux-ia64@vger.kernel.org, Linus Torvalds , dsterba@suse.cz, ptesa
gccとVC x86/x64環境で開発する上で, gccとVCはどちらも非常に優れたC/C++コンパイラです. ただLinuxとWindowsのどちらの環境でも動作するようなC/C++コードを書くためには, gccとVC, およびそれらが動作するOSの違いが問題になることがあります. ここではそれらの違いについてまとめていきたいと思います. なお説明を簡単にするためにマクロを多用していますが実際には可能なら別の手段をとるか, 名前がぶつからないような命名規則に則ったマクロ名をつけることをお薦めします. 対象 定義済みマクロ 有用なマクロ コンパイルオプション 演算子の代替表現の抑制 日本語のコメント 型 pragma attributeとdeclspec ファイル入出力 テキストとバイナリ 巨大なファイル static変数の初期化 snprintf 例外ハンドラ intrinsic関数
OpenMPは複数のCPU(複数コアを含む)を持った計算機上での並列化に威力を発揮する。 OpenMPを使う最大の利点は、OpenMPに対応したコンパイラであれば、非常に簡単に並列化できる点である。 現在、gcc、Visual C++、およびIntelコンパイラなど主要なコンパイラはOpenMPに対応している。 習得も他の並列化技法に比べて比較的容易である。 なお、速度を最優先にする場合、単一コンピュータ上で動かした場合でも、メモリのローカリティのためかOpenMPよりMPIの方が効率のよいことが多い。MPIに関してはこちらを参照。 なお、インテルがOpenMP初心者向けに非常にわかりやすい文書を公開している。 OpenMPプログラムのコンパイル OpenMPの各種関数を使わない場合、#pragma ompで始まる指示をソースコード内に書き込み、下記のコンパイルスイッチをつけてコンパイルす
人の作った C プログラムを gcc でコンパイルしていたら、 XXXXX.c:999: error: label at end of compound statement とのエラー。 該当箇所は static void foo(struct XXXXX *x) { if (x->xxxxx != NULL) { DBG(&xxx, "xxxxx"); goto done; } // 中略 done: bar(1); } のようになっていた。 static void foo(struct XXXXX *x) { if (x->xxxxx != NULL) { DBG(&xxx, "xxxxx"); goto done; } // 中略 done: <strong><font color="red">;</font></strong> bar(1); } 何もしない空行であるセミコロン(;
August 2011 (1) July 2011 (1) June 2011 (2) April 2011 (2) March 2011 (2) February 2011 (2) January 2011 (6) December 2010 (6) November 2010 (5) October 2010 (8) September 2010 (2) August 2010 (3) July 2010 (9) June 2010 (4) March 2010 (1) February 2010 (7) January 2010 (2) はじめに C/C++とmake使ったプロジェクトのビルド時間短縮について書いてみます。 対象となるのは、 大規模プロジェクトに関わっていて、ビルド時間長すぎ… 少人数だけど、大きなパッケージが絡んでいて、ビルド時間長すぎ… なプロジェクトに関わってい
gccのインクルードパスと言っても、#includeを処理するのはプリプロセサなので、まずgccがどのプリプロセサを使うかを調べて、そのプリプロセサからインクルードパスを調べなければならない。 なので最初にgccが使うプリプロセサを調べなければならないが、まともな方法がわからないので、以下のソースを-vオプションつきでコンパイルしてそこから探してみる。 Using built-in specs. Target: i386-redhat-linux コンフィグオプション: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-bootstrap --enable-shared
main() の前に関数を呼ぶ C/C++ のプログラムで、main() の前に関数を暗黙的に呼びたいときがあります。ここでは GCC の拡張を使った方法と、C++ のコンストラクタを使った方法を紹介したいと思います。 GCC では main() の前に呼ばれる関数を __attribute__((constructor)) という拡張機能を使って定義できます。たとえば、次のプログラムでは main() の前に foo() が呼び出されます。 #include <stdio.h> __attribute__((constructor)) void foo() { printf("hello, before main\n"); } int main (int argc, char **argv) { printf("hello, world\n"); return 0; } 実行結果は以下の
gccとかgdbとかgoogle-perftoolsとか、C言語のLinux環境関連のメモ コンパイル # バージョンを確認する gcc -dumpversion # オプションつけないでコンパイル gcc xxx.c → a.out という名前の実行ファイルが出来る。実行権限もつけてくれるようだ。 # 実行ファイル名を指定したいとき gcc -o xxx xxx.c → xxx という名前の実行ファイルが出来る # その他のオプション -Wall : 警告を全部みせる -O1 (-O) : ゆるい最適化 -O2 : 普通の最適化 (普通はこれをつかうそうだ) -O3 : 強力な最適化 (コンパイラのバグを引き当てたりするそうだ) -g (== -g2) : デバッグ用のシンボル -g3 : マクロも展開する -g
古来より、関数スコープの静的なオブジェクトを作るのは危険 void foo() { static CBar bar; // こんなの とされています。foo()が初めて呼ばれたタイミングでbarのコンストラクタが走るわけですが(C++規格でそう決まっている)、foo()の初回呼び出しが2つのスレッドでほぼ同時に行われると、barのコンストラクタが複数回走ってしまったりと、不可解な動作をすることが知られています。 参考サイト: http://blogs.msdn.com/oldnewthing/archive/2004/03/08/85901.aspx (引用するの何度目だろ) ところが、最近のg++には -fthreadsafe-statics っていうオプションがあって、この初回のコンストラクタ呼びをスレッドセーフに行ってくれるようになりました。手元のgcc3.4.3ではデフォルトでon
という言い方で正しいのかどうかはさておき。 Rubyにまつわるえとせとら日記(2004-01-17)に書いてあるように gcc -E -dM -xc /dev/nullで一覧表示。Cygwin環境の切り分けとかに使うとよろし。
::memolet Personal Notes Site about programming, software, etc...... 以下の警告をどうしても消せなくて、Googleで検索したら同様な経験をされた 方がいた。 warning: dereferencing type-punned pointer will break strict-aliasing rules "-fno-strict-aliasing"を指定して抑制するしかない模様。 strict aliasing rule [Radium Software Development] 規格書に基いた考察。 [C++]radix sortがgcc 4.xでsegmentation faultする件 同じ警告に対処されたよう。
最近の gcc だと、可変長引数マクロを使っても特に警告を出さないようです. そこで、以下のようなマクロを定義しておくと、デバッグメッセージのON/OFFが手軽にできて便利です. #ifdef __DEBUG__ #define dprintf(fmt,...) \ printf("[%s]%d:" fmt "\n",__FUNCTION__,__LINE__,__VA_ARGS__) #define dputs(str) \ printf("[%s]%d:" str "\n",__FUNCTION__,__LINE__) #else #define dprintf(fmt,...) while(0){} #define dputs(str) while(0){} #endif これを使ったサンプルプログラムです. //ここで ON / OFF を切り替える //#define __DEB
お母さんみたいにもっと3ヶ月前に教えて欲しい Posted by admin on the 28th of 3 月, 2008 at 12:00 am under 未分類. This post has no comments. ccacheを使えば、C++のコードのコンパイルが死ぬほど遅くても大丈夫という情報が。これはheaderファイルなど頻繁には変更しないような部分のコンパイル結果を自動的にキャッシュしてくれるソフトウエアだ。よっぽどのことがないかぎり、一人で開発しているコードでは、includeする色々なheaderファイルのほうが、自分で入力するソースコードより多い。しかも、template programmingを使いまくるBoost Spiritのようなinculdeするheaderが大きくて、構文解析の処理量が多いライブラリを利用していると、明らかにheaderのせいで
Googleが昨年発表したオープンソースのプログラミング言語「Go」が早ければGCC 4.5でマージされることが明らかになった。 GNU Compiler Collection(GCC)を監督するGCC Steering Committeeは1月26日、米Googleの「Go」をサポートする方針を発表した。早ければ「GCC 4.5」でマージされるという。 Goは、Googleが2009年11月に発表したオープンソースのプログラミング言語。Pythonのような動的言語の開発スピードと、CやC++のようなコンパイル言語の性能を併せ持つことを目的とする。 GCCは今後、gccgoフロントエンドとgccランタイムの貢献を受け付けマージを進める。メンテナーはGoogleのイアン・タイラー氏。サポートはGCC 4.5以降となり、GCCリリースマネジャーがコンパイラにマージする時期などを決定する。 GC
http://vrt-sourcefire.blogspot.com/2009/07/how-do-i-become-ninja.htmlを読んで http://community.corest.com/~gera/InsecureProgramming/をやってみた WARMING UP on STACKではこんな感じの明らかに脆弱なプログラムが問題になっている /* stack1.c * * specially crafted to feed your brain by gera */ int main() { int cookie; char buf[80]; printf("buf: %08x cookie: %08x\n", &buf, &cookie); gets(buf); if (cookie == 0x41424344) printf("you win!\n"); } W
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く