タグ

gccと解説に関するiwwのブックマーク (11)

  • GCC / LLVM Sanitizer の使い方

    はじめに メモリ関連のバグ(メモリリーク)を見つけるためのツールの一つである、GCCもしくはLLVMのSanitizerについての記事です。 使い方 使い方は至って簡単で、後述の用途に応じてコンパイルオプションを追加してビルドし、通常通り目的のプログラムを実行するだけです。 Memory Sanitizer メモリ領域は確保したものの、プログラムで意図的に初期化されていないメモリへのアクセスを検出する場合に利用します。 void main() { auto *buff = new char[256]; buff[0] = 1; std::cout << buff[1] << std::endl; // [1]は見初期化のためここでエラー検出 }

    GCC / LLVM Sanitizer の使い方
    iww
    iww 2024/03/23
    サニタイズいろいろ
  • 【C】可変長マクロで引数なしを受け渡すには ##__VA_ARGS__ (gcc拡張)

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

  • Makefile の補足

    make は実行プログラムの作り方を知っている make コマンドは, 実は C や C++ のソースプログラムから実行プログラムを作製する方法を最初から知っています. このため, 一つのソースプログラムから一つの実行プログラムを作成するような場合は, Makefile において手続き(コマンド)の記述を省略することができます. CFLAGS = -I/usr/X11R6/include LIBS = -L/usr/X11R6/lib -lglut -lGLU -lGL -lXmu -lXi -lXext -lX11 -lm -lpthread all: prog1 prog2 prog1: prog1.c --Tab-->$(CC) $(CFLAGS) prog1.c -o prog1 $(LIBS) prog2: prog2.c --Tab-->$(CC) $(CFLAGS) prog

    iww
    iww 2017/08/22
    LDLIBS
  • Difference between -pthread and -lpthread while compiling

    iww
    iww 2017/07/11
    -pthreadオプションを付けると、なんかdefineが増えて、もしかしたらスレッドに最適化してくれるかもしれない という話。
  • -pthread を忘れると std::thread で例外が発生する仕組み - Qiita

    std::thread を使用したソースを -pthread オプションを付けずにビルドすると、ビルドエラーにならずに実行時エラーになる仕組みが気になったので調べてみました。 パスやら何やらは x86-64 版の Gentoo Linux のものです。他ディストリビューションでは微妙に異なるかもしれません。 -pthread オプション g++ や clang++ で C++11 以降に実装された std::thread を使おうとすると、オプション -pthread が必要です。これを忘れると、スレッドを実行しようとした時点で例外が発生してしまいます。 #include <iostream> #include <thread> void func() { std::cout << "Hello!" << std::endl; } int main() { std::thread(func

    -pthread を忘れると std::thread で例外が発生する仕組み - Qiita
  • OpenMPの基本的な使い方 - Qiita

    サーバサイドの大規模計算・組み込み系・ゲームプログラミングなどの分野ではしばしば高速化を求められることがある。 その中でも、スレッド並列に関する高速化はマルチコア化の波で近年特に求められている。 この記事ではスレッド並列にOpenMPを利用した高速化手法についての基的な部分を紹介していく。 *言葉の解釈によっては適切でない部分や、OpenMPの正しい使い方から外れた部分があるかもしれません。 *2017.02.16 記事の一部に書き途中・適切ではない記載があったので更新しました。 スレッド並列化とは? スレッド並列化とは、近年のPCによく使われているマルチコアのCPU上で行われる並列化のことである。CPUによっても変わるが、主流のIntel社製Core iシリーズのCPUなどでは1コアで2スレッドまでのスレッドを持つことができる。 例に、2016年の新モデルMacBookProの13イン

    OpenMPの基本的な使い方 - Qiita
  • [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 バイ

  • __null ‐ 通信用語の基礎知識

    わざわざ独自定義する以上は、__nullはポインター長の独自の型として振る舞い、int型への代入でエラーになることが期待されるところである。しかし、そのように動くかどうかは、環境による。 32ビット環境では、現実には(int)0と同じ扱いである。 次のコードはエラーにならない。 int i = __null; そして、typeid(__null).name()で__nullの型を調べると、「int」と出力される。32ビット環境では、__nullはint型なのである。 __nullが存在するのは、64ビット環境への対応のためである。64ビット環境では、NULLと0は同一とは限らない。 #include <iostream> int main() { std::cout << "sizeof(NULL) : " << sizeof(NULL) << std::endl; std::cout <

  • GCCの組込みアトミック命令の使い方 | Everyday Deadlock

    ちょっと使うことがあったので、備忘録的にGCCの組込みアトミック命令の使い方についてまとめておきます。 前提知識 マルチスレッドプログラムにおいて、共有データを更新する際の定石は spin lock や mutex でデータを保護することです。 これらの道具は多くの場面において十分便利なのですが、例えば共有データが1個の int 変数のみであり、更に高頻度で更新が行われるといった場合にはやや同期のコストが高くついてしまいます。 そのような場合には、アトミック命令を用いることで同期オーバーヘッドを抑えることができます。 アトミック命令とは、複数のスレッドから実行されても、個々の命令が一つ一つ順番に適用されてゆくことが保証されている命令のことです。 (より正確には、個々の命令がとある順番で一つ一つ適用された時と同じ結果を得られることが保証されている命令のことです) 例えば、とある変数 X の値

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

  • 普通のやつらの下を行け: C でバックトレース表示 - bkブログ

    普通のやつらの下を行け: C でバックトレース表示 普通のやつらの下を行けの第2回として、今回は glibc の関数を使って C でバックトレース (スタックトレース) の表示を行ってみます。 バックトレースとは バックトレースとは、大ざっぱに言うと、現在の関数に至るまでの道筋です。たとえば、次の Ruby プログラムを実行すると、 1 / 0 の行で例外が発生して、バックトレースの表示とともにプログラムは異常終了します。 def foo 1 / 0 end def main foo end main この例では main から foo を呼び foo の中の 1 / 0 の部分で例外が発生しています。 % ruby divide-by-zero.rb divide-by-zero.rb:2:in `/': divided by 0 (ZeroDivisionError) from div

  • 1