タグ

gccとCに関するiwwのブックマーク (25)

  • AddressSanitizerを試す - cuspy diary

    C言語 Advent Calendar 2016 16日目です。 clang 3.1, gcc 4.9以降にメモリ関連の不正な操作を検出するAddressSanitizerという仕組みが入りました。 二重freeやバッファオーバーフローなどCプログラミングにありがちなメモリ操作を検出できるので、ソフトウェアの品質向上だけでなく、セキュリティ対策としても有用です。 以下に思いつく限りのメモリの不正操作を実際に試してみました。 (1) スタックオーバーフロー(1.1) 正方向の書き込み [stack_overwrite.c] (https://github.com/hamano/santest/blob/master/tests/stack_overwrite.c)(1.2) 正方向の参照 [stack_overread.c] (https://github.com/hamano/santes

    AddressSanitizerを試す - cuspy diary
  • 【C】可変長マクロで引数なしを受け渡すには ##__VA_ARGS__ (gcc拡張)

    C言語のマクロの引数の最後に ... を指定することで任意個の引数を取り、 __VA_ARGS__ で参照できる:

  • stdout thread-safe in C on Linux?

    iww
    iww 2018/09/12
    printfはスレッドセーフという話
  • gprofを使いこなす - minus9d's diary

    C/C++のコードの速度を改善するときに有効な方法は、処理時間を多く消費する関数を見極めて、その関数を改善することである。どの関数が(1)どれだけ処理時間を消費するか、(2)何度呼ばれているか、(3)どの関数を呼んでいる/どの関数に呼ばれているか、などを測定する行為をプロファイリングといい、その手助けをするツールをプロファイラと呼ぶ。今回はC/C++のプロファイラとして有名なgprofの使い方を紹介する。 プログラムの例 GNUプロファイラーによるコード処理速度の向上 のコードを参考にして作成した以下のコードをgprofでプロファイリングしてみよう。main()はa()とb()を100000回呼ぶ。b()はa()の約4倍時間を消費する。またmain()自身も、a()とb()を呼び出してその結果を待つ以外に、a()の約1/3の時間を消費する。 // main.cpp #include <cs

    gprofを使いこなす - minus9d's diary
  • PIE (位置独立実行形式) を作成する - bkブログ

    PIE (位置独立実行形式) を作成する 通常、PIC (位置独立コード) は共有ライブラリに用いられますが、Linux 上で最近の GCC, Glibc および GNU Binutils を使うと、実行ファイルも位置独立にすることができます。記事では PIE (位置独立実行形式) を作成する方法と特徴を紹介します。 PIE の基 それでは例を見てみましょう。次のようなファイル foo.c があるとします。 #include <stdio.h> void foo() { printf("hello\n"); } int main() { foo(); return 0; } このファイルを -fPIE というオプションをつけてコンパイルし、 -pie というオプションをつけてリンクすれば PIE を作成できます。出来上がったファイルは普通に実行できます。 % gcc -c -fPIE

    iww
    iww 2017/08/25
    ld-linux.so みたいな、実行できるキモいライブラリを作るオプション
  • Using the GNU Compiler Collection (GCC)

    iww
    iww 2017/07/25
    errnoとかが使ってるやつ。 スレッド局所記憶。 スレッドローカルストレージ。 Thread Local Storage. TLS
  • C99 - Wikipedia

    C99は、ISOで定められたC言語の規格である。正式な規格名は ISO/IEC 9899:1999。 歴史[編集] ANSIの標準化プロセス(C89)のあと、C言語仕様はC++が標準化の取り組みによって進化しているのと比べて停滞していた。1995年には標準追補を作成したが、これはC89への細かい修正および国際文字集合対応の追加であった。1990年代の後半にいくつかの訂正を経て、ISO/IEC 9899:1999 として1999年に発行した。この標準は"C99"と呼ばれ、ANSI標準としても2000年5月に受理。国際的なC標準は作業部会ISO/IEC JTC1/SC22/WG14で保守している。 新機能[編集] C99にはさまざまな新機能が導入された。その多くはさまざまなコンパイラによってすでに拡張として実装されていた。 インライン関数 ファイルスコープでない変数宣言がブロックの先頭になけれ

    iww
    iww 2017/07/21
    『GCC 4.x までのデフォルトは C89 に GNU 拡張を加えた -std=gnu89』
  • C/C++でOpenMPを試してみる

    OpenMPとは? OpenMPとは、並列プログラミング用の 機能で、C/C++, Fortran で使用できます。並列プログラミングには色々とありますが、以下の様な利点があります。 通常のプログラムからOpenMPを使用するように書き直しやすい。 ハード(CPUのコア数)に依存しないプログラムが書きやすい。 Visual Studio(Pro2005以降), gcc(4.2以降), インテルコンパイラ(V9以降)などある程度マルチプラットフォームで使用できる。 逆に欠点としては以下があります。 記述に#pragmaディレクティブというコンパイラ専用の機能の記述に使用する方法を使用するので、プログラムが見にくくなる。 パフォーマンスは特にコア数が増えると今一歩のところがあるらしい。 現在OpenMP4.0まで出ているが、Visual StudioはOpenMP2.0まで、LLVMは現在Op

  • Valgrindの結果の見方、日本語訳、など役に立つことまとめ - 結果だけでなく過程も見てください

    勉強がてらメモ。 適宜更新していこう。うん。 Valgrindって? デバッグやプロファイラなどの複数のツールから構成されるツール群の総称。 メモリリークチェックツールとして有名だと思いますが、 それはValgrindツール群の中のMemcheckというツールによる機能だったのですね。 どんなツールがあるのか?マニュアルを見ると・・・ Memcheck 言わずと入れたメモリエラー検出ツール。特にC/C++に向いている。リークチェックやバッファーオーバーランなどね。 Cachegrind プログラムのキャッシュグラフ、または分岐予測をしてシミュレートする。プログラムを速くするために使うツール。 Callgrind 関数呼び出しをトレースしたりできる。Cachegrindをかぶる部分もあるが、Cachegrindとは別の情報も収集できる。 Helgrind マルチスレッドのプログラム向け。スレ

    Valgrindの結果の見方、日本語訳、など役に立つことまとめ - 結果だけでなく過程も見てください
  • GCC some extensions

    gcc(Gnu C Compiler)の拡張文法 [警告!] C/C++言語初心者はこのページを読まないでください。 このページではgcc独自のC/C++拡張文法について解説します。 これらの拡張文法が可能にする機構は確かに便利なのですが、 もちろんANSI規格に従っていないので、一般的には使うべきではありません。 C/C++言語文法を学び始めている初心者はこれらgcc拡張文法を 知るべきではありません。C/C++言語を正しく理解する上で大きな 支障となります。 C/C++言語を十分に熟知した者は、gccがこのようなこともすることを 「雑談」として知っておくと楽しいかもしれません。もちろん 実戦に使うべきではありませんが。しかし初心者が偶然に、これらの 機能を使ってうまくいく場合がありますので、そのような初心者を 見つけたら、それが標準規格ではないことを注意してください。 配列変数をコピー

    iww
    iww 2014/10/24
    知らなかったことのオンパレードだ・・・ 1995年の記事なのに
  • sprintf を最大10倍以上高速化するプリプロセッサ「qrintf」を作った

    最近H2OというHTTPサーバを書いているのですが、プロファイルを取ってみるとsprintfが結構な時間をっていて不満に感じていました。実際、sprintfは数値や文字列をフォーマットするのに十徳ナイフ的に便利なので、HTTPサーバに限らず良く使われる(そしてCPU時間を消費しがちな)関数です。 では、sprintfを最適化すれば、様々なプログラムが より高速に動作するようになるのではないでしょうか。ということで作ったのが、qrintfです。 qrintfは、Cプリプロセッサのラッパーとしてソースコードに含まれるsprintfの呼出フォーマットを解析し、フォーマットにあわせたコードに書き換えることで、sprintfを高速化します。 たとえば、以下のようなIPv4アドレスを文字列化するコード片を sprintf( buf, "%d.%d.%d.%d", (addr >> 24) & 0xf

  • C11 (C言語) - Wikipedia

    C11とは、ISOで定められたC言語の規格のひとつ、ISO/IEC 9899:2011[1]の通称であり、その前の規格であったC99の後継である。規格策定中の暫定名称は C1X であった。新しい規格であるC11では、マルチスレッドのサポートを改善する詳細なメモリモデルなどの、一般的な現代のコンパイラでサポート済みの機能を主に規格化している。C99の実装では適合が遅れたため、C11では中核となる言語規格に準拠し易いよう特定の機能をオプションにしている[2][3]。 2011年4月にC11の最終ドラフトであるN1570[4]が発行され、2011年10月10日に新しいC11規格はその最終ドラフトレビューをパスして公式にISOによって承認された。それから2011年12月8日に参加国による決議が必要な批評もなく、ISO/IEC 9899:2011として発行された。 標準マクロである__STDC_VE

    iww
    iww 2014/08/12
    そろそろ使ってみたい
  • [PDF] Hello, Binary World!

    さとう ゆうすけ <ads01002 @ nifty.com> Binary2.0 Conference 2006 発表資料 自己紹介 さとう ゆうすけ (d:id:yupo5656)  ソフトウェア エンジニア  Hello World愛好家  Binary Hacks の執筆に参加  主な担当ハック: #25 「glibcを使わないでHello Worldを書く」 自己紹介  好きな休日の過ごし方  コードを読む、書く  読書 ○ The Single UNIX Specification ○ ISO/IEC 9899:1999 (C) ○ ISO/IEC 14882:2003 (C++)  SICPの問題をC++で解く  Z80マイコン製作  Hello World 自己紹介 + 日の話のレベル user-space バイナリアン kernel-space バイ

  • cpp-tools - Cソース中の大量のifdefを読みやすくしたい(ツール探索編) - spikelet days

    目的 #ifdefが複雑にネストしているCソースファイル中で、どの部分が有効かを簡単に調べたい。 背景と動機については id:taiyo:20080202#p1 などを参照。 結果 C FAQ(Question 10.18)で紹介されている3つのツールと、手元にあったツール1つを試した。 名前 処理可能なディレクティブ 処理方法 感想 rmifdef #ifdef, #ifndef, #else 不明(バイナリ配布) 判定対象が狭く、あまり使い出がない unifdef #ifdef, #ifndef, #else 独自の文字列処理 出力エラーでソースが乱れるのが致命的 scpp 全ディレクティブ lex&yac マクロ展開までされるのと、#if 0を処理しないのがやっかい pcpp 全ディレクティブ 不明(バイナリしか持ってない) 不都合は今のところみつからず pcppが、機能面では不満が

    cpp-tools - Cソース中の大量のifdefを読みやすくしたい(ツール探索編) - spikelet days
  • KMC Staff Blog:gccのビルトイン関数 (printf)

    2009年07月03日 gccのビルトイン関数 (printf) gccのtipsを紹介します。主にgcc3.x からgcc4.x で変わっているところです。 #include <stdio.h> int main() { printf("Hello, world!\n"); } このプログラムはgcc3では普通にprintfを呼び出すコードを生成しますが、gcc4ではどうなるでしょうか。ARM版のexeGCC4でちょっと試してみます。 > gcc -S hello.c 生成されたhello.s を見てみると ... .LC0: .ascii "Hello, world!\000" .text .align 2 .global main .type main, %function main: @ args = 0, pretend = 0, frame = 8 @ frame_needed

  • コードを愛でる - main=195;

    iww
    iww 2012/08/06
    こういう回避方法もあるのか
  • gccにおけるatomic操作命令の個別関数

     gccとVC x86/x64環境で開発する上で, gccとVCはどちらも非常に優れたC/C++コンパイラです. ただLinuxWindowsのどちらの環境でも動作するようなC/C++コードを書くためには, gccとVC, およびそれらが動作するOSの違いが問題になることがあります. ここではそれらの違いについてまとめていきたいと思います. なお説明を簡単にするためにマクロを多用していますが実際には可能なら別の手段をとるか, 名前がぶつからないような命名規則に則ったマクロ名をつけることをお薦めします. 対象 定義済みマクロ 有用なマクロ コンパイルオプション 演算子の代替表現の抑制 日語のコメント 型 pragma attributeとdeclspec ファイル入出力 テキストとバイナリ 巨大なファイル static変数の初期化 snprintf 例外ハンドラ intrinsic関数

    iww
    iww 2012/01/19
    関数内のstatic変数の初期化はデフォルトでスレッドセーフ
  • Apple

    iww
    iww 2011/09/28
    strrchrでちょん切れ という話
  • Perl Tips | C で、error: label at end of compound statement

    人の作った 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); } 何もしない空行であるセミコロン(;

    iww
    iww 2011/09/24
  • main() の前に関数を呼ぶ - bkブログ

    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; } 実行結果は以下の