タグ

cに関するkenichiiceのブックマーク (68)

  • [Linux][C/C++] backtrace取得方法まとめ - Qiita

    __builtin_return_address() を使用する __builtin_return_address() を利用することで、callerのアドレスを取得できる。 引数の数値を増やすことで、更に上の呼び出し元を参照できる。 #include <stdio.h> #define __USE_GNU #include <dlfcn.h> void hoge() { Dl_info info; dladdr(__builtin_return_address(0), &info); fprintf(stderr, "%s : __builtin_return_address => %p\n", __func__, __builtin_return_address(0)); fprintf(stderr, "%s : Dl_info.dli_fname => %s\n", __func_

    [Linux][C/C++] backtrace取得方法まとめ - Qiita
  • 低レイヤを知りたい人のための Cコンパイラ作成入門

    はじめに このオンラインブックは執筆中です。完成版ではありません。フィードバックフォーム このには一冊のに盛り込むにはやや欲張りな内容を詰め込みました。書では、C言語で書かれたソースコードをアセンブリ言語に変換するプログラム、つまりCコンパイラを作成します。コンパイラそのものもCを使って開発します。当面の目標はセルフホスト、すなわち自作コンパイラでそれ自身のソースコードをコンパイルできるようにすることです。 このでは、コンパイラの説明の難易度が急に上がりすぎないように、様々なトピックを書全体を通じて次第に掘り下げていくという形で説明することにしました。その理由は次のとおりです。 コンパイラは、構文解析、中間パス、コード生成といった複数のステージに概念的に分割することができます。よくある教科書的アプローチでは、それぞれのトピックについて章を立てて解説を行うことになりますが、そのよう

  • Preprocessor Output (The C Preprocessor)

    9 Preprocessor Output ¶ When the C preprocessor is used with the C, C++, or Objective-C compilers, it is integrated into the compiler and communicates a stream of binary tokens directly to the compiler’s parser. However, it can also be used in the more conventional standalone mode, where it produces textual output. The output from the C preprocessor looks much like the input, except that all prepr

    kenichiice
    kenichiice 2018/03/13
    GCCのプリプロセッサの出力フォーマットの説明。「linemarkers」の仕様とか。
  • volatileが必要な場面を見つけ出す

    1#include<signal.h> 2 3sig_atomic_t interrupted; 4 5void sigint_handler(int signum){ 6 interrupted = 1; 7} 8 9int main(){ 10 signal(SIGINT, sigint_handler); 11 while(!interrupted){ 12 [何かの処理] 13 } 14 return 0; 15} このコードは sig_atmoic_t interrupted にvolatileが付いていないので最適化するとバグります。 main()からの読み取りは、コンパイラの最適化によって削除されてしまう可能性がある。 真っ先に思ったこと:「知らねぇぇぇ・・・ & なんで??」 最適化によって削除されたり、変更されたりする変数を把握することができません。 **つまり、vola

    volatileが必要な場面を見つけ出す
    kenichiice
    kenichiice 2018/02/20
    「「マルチスレッドアプリ開発ではvolatileが必要」という主張は、C/C++言語においては全くの誤りです。これらは昔のC/C++開発環境を前提としているか、他言語の話題と混同されているケースが大半です。 」
  • Useful GCC warning options not enabled by -Wall -Wextra

    Note: This blog post was written for GCC 7. Later versions of the compiler may have added some of these warnings to -Wall or -Wextra. GCC can warn about questionable constructs in the source code, but most such warnings are not enabled by default – developers need to use the options -Wall and -Wextra to get all generally useful warnings. There are many additional warning options that are not enabl

  • linuxカーネルで学ぶC言語のマクロ - Qiita

    はじめに 記事は電子書籍版もあります。 linuxカーネルはC言語のマクロを駆使して書かれています。それらのうち、凝ったマクロになじみの無い人には初見では意図がわからない&わかってみれば面白いであろうものをいくつか紹介いたします。対象読者は、C言語のユーザだけれども、マクロは定数定義くらいにしか使わないというライトなマクロユーザです。 マクロを使用する場所に依存するエラーを防ぐ 次のマクロは、二つの引き数の値を置換するだけの単純なものです。

    linuxカーネルで学ぶC言語のマクロ - Qiita
  • Makeでヘッダファイルの依存関係に対応する - wagavulin's blog

    CやC++で書かれたプログラムをMakeを使ってビルドする、というのはUnix/Linuxではよく行われていることだが、ちゃんとしたMakefileを書くのは意外と難しい。 例えば以下の3つのファイルからなるプログラムを考える。 foo.h: 関数fooの宣言がある。 foo.c: 関数fooの実装がある。 main.c: 関数fooを呼び出す。 /* foo.h */ void foo(int a); /* foo.c */ #include "foo.h" #include <stdio.h> void foo(int a){ printf("%d\n", a); } /* main.c */ #include "foo.h" int main(int argc, char **argv){ foo(10); return 0; } Makefileは例えば以下のように書ける。 PRO

    Makeでヘッダファイルの依存関係に対応する - wagavulin's blog
  • テキストファイルの全部を読んで行単位にする - 主題のない日記

    プログラミング言語 C でテキスト処理をしようと思うと何かと面倒なことは多い。 ただ行ごとに読むというだけのことにでもひどく手間をかけさせられてしまう。 それをなんとか工夫して実装しようとしている記事を読んだ。 もう 20 年ほど前のことになるが、私はチャット CGI を C で書いたことがあり、その中で似たようなことをやったというのを思い出した。 そのときの技法 (というほど大したものではないが) を紹介したいと思う。 考え方 結局ファイル全部を読むのだから一度に読んでしまえば良いではないかというのが基的な発想だ。 fread 関数を使ってテキスト全部を読めば改行で区切られたひとつの文字列が出来上がる。 改行をヌル文字に置換えた上でそれぞれの行の先頭を指すポインタの配列を作れば、見掛け上は行ごとの文字列になっているかのように見える。 ちなみに、以下の実装では改行が 0d 0a の2バイ

    テキストファイルの全部を読んで行単位にする - 主題のない日記
    kenichiice
    kenichiice 2016/03/14
  • Man page of FMEMOPEN

    kenichiice
    kenichiice 2016/02/22
    open_memstream()を使えばオンメモリなファイルストリーム(FILE*)を作れる
  • 2016年、C言語はどう書くべきか (前編) | POSTD

    (訳注:2016/3/2、いただいた翻訳フィードバックをもとに記事を修正いたしました。) (訳注:著者のMattより、「文中で明言はしていないが、この記事の内容はx86-64 Unix/Linux/POSIXでアプリケーションをプログラミングする場合にフォーカスしている。他のプログラミング領域では、対象とするシステムに応じた(例: 8-bitの組み込みシステム、10年前のコンパイラ、多くの異なるCPUアーキテクチャで動く必要のあるアプリケーション、Win/Linuxでのビルド互換性など)特有のアドバイスが必要」との補足を頂いております。) 以下の文章は2015年の始めに書いたドラフトで、今まで公開していませんでした。私のドラフト用フォルダの中で誰の目も引かなかったため、大部分が書いた時のままです。公開するにあたり、単純に2015年を2016年に変更しました。 必要な修正、改善、苦情があり

    2016年、C言語はどう書くべきか (前編) | POSTD
  • はじめてのにき(2015-04-29)

    _ syscall と syscall wrapper なんか安くなってるとのことで、遅らばせながらアセンブラ短歌を読んでみた。なんか自分でも考えてみたくなる。 で、中の余談の一節のしょうもないことが気になった。 なお正式 には exit() は _exit() を呼び出すためのライブラリ関数であり, _exit() が 来 のシステムコールの API だ . このため 「exit システムコール」 ではなく 「_exit システムコール」 と表記すべきで , man のカテゴリは exit(3) と_exit(2) になっている . まあでもあまり気にせずに , ここでは 「exit システムコール」と呼んでしまっている . これはなんか全体的におかしいような気がする。 int 0x80 で呼ぶ文脈なんだから、 linux システムコールというレイヤで見るべきというのは良いと思う。間

    kenichiice
    kenichiice 2015/05/14
    「まず、システムコールまわりには3つのレイヤがあると考えて良いと思う。」
  • わずか500行のCソースコードで作られたCコンパイラ「CC500」 | ソフトアンテナ

    Cコンパイラといえばとてつもなく複雑なプログラムというイメージがあります。ところが、このCコンパイラを(サブセットとはいえ)わずか500行ほどのCのソースコードで実現した「CC500」名付けられたプログラムが公開されています。 ソースコードは可読性を維持するためにつけられた空行やコメントを含めると、実際は750行ほどになるそうですが、それでもこれだけコンパクトなソースコードで実行可能なELFバイナリ(Linux用のバイナリ)を生成できるのは興味深いのではないでしょうか。 以下実際にLinuxでコンパイルしてみました。 自己コンパイルできる このコンパイラはC言語のサブセットで、自分自身のソースコードをコンパイルできるところがおもしろいところです。まず「cc500_1」という実行ファイルを生成します。 gcc cc500.c -o cc500_1 生成された実行ファイル「cc500_1」を使

    わずか500行のCソースコードで作られたCコンパイラ「CC500」 | ソフトアンテナ
  • C言語プログラミングの覚え書き(改訳) - アスペ日記

    原文: Notes on Programming in C Rob Pike 1989年2月21日 Copyright (C) 2003, Lucent Technologies Inc. and others. All Rights Reserved. Lucent Public License Version 1.02 前書き KernighanとPlaugerによる“The Elements of Programming Style” (「プログラム書法」木村泉訳)は重要で影響力のあるです。このにはそれだけの価値があります。しかし、その中の簡潔なルールが、来意図されたような哲学の簡潔な表現としてではなく、よいスタイルのレシピとして受け取られているように私は時々感じます。このが変数名は意味を持つようにつけられるべきだと言うなら、名前が使い方を説明するちょっとしたエッセイのような

    C言語プログラミングの覚え書き(改訳) - アスペ日記
  • 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

  • 符号なし加算の桁あふれと符号なし減算の桁借り - Tociyuki::Diary

    C 言語のほとんどの実装は、符号なし整数を剰余項として扱うだけで、桁あふれの発生を通知する機構を持つ数値型を提供していません。剰余項の加算の桁あふれは範囲チェックをすり抜ける原因になり、桁あふれを無視したことがセキュリティ・ホールになった事例がいくつも報告されています。桁あふれ判定はプロセッサの演算回路に必須の機能なので、ハードウェアは桁あふれの有無を加算時に常にチェックしています。ですが、ハードウェアで検出されている桁あふれの有無を C 言語で変数へ得るにはインライン・アセンブラの助けが必要になります。例えば、x86 アーキテクチャの場合、GNU C のインライン・アセンブラでプロセッサのキャリーフラグを読み出すことで、桁あふれと桁借りを変数に求めることができます。 uint32_t carry; /* 0: 桁あふれなし, 1: 桁あふれあり */ uint32_t borrow; /

    符号なし加算の桁あふれと符号なし減算の桁借り - Tociyuki::Diary
    kenichiice
    kenichiice 2014/09/26
    「carry と borrow をソフトウェアだけで得るには、The GNU MP Bignum Library にならって、剰余項の加算の性質を使います。」
  • Big Sky :: clib の使い勝手にマジ感動した

    C言語でアプリケーションを書くのは他の言語と比べて少し気合が必要ですよね。例えば HTTPからデータを取得する 取得したデータを json パースする 結果の一部を色付きで表示する こんな場合、C言語プログラマは 「HTTP か、じゃぁcurlかな」 「JSON か、parson かな」 「色表示か...エスケープシーケンスでもいいけどWindowsがなー...」 といった事を考え、そこから curl や parson といった資材の調達を始める事になります。途中で新しい機能を追加したくなり、それを外部ライブラリに頼る場合だとその都度資材を調達する必要があり、思考を停止しなければなりません。 この辺は rubyperl、nodejs、golang 等の様に、ちょっとした手間だけで済ませたい物です。 またC言語の場合、ヘッダファイルはシステムの include フォルダに提供元が期待す

    Big Sky :: clib の使い勝手にマジ感動した
    kenichiice
    kenichiice 2014/06/28
    「言うなれば、C言語版の bundler であったり、carton であったり、npm だったりする訳です。」
  • Vim で自動的にヘッダーを include する - C++でゲームプログラミング

    面白いプラグインがあったので紹介。 vim-cpp-auto-include : Automatically insert or delete `#include`s for C++ code - vim.org vim-cpp-auto-include - github github に gif 動画が上がっているので、それを見てもらえれば何となく分かると思うのですが、そのコード中で使用されている関数のヘッダーファイルを自動的に include するプラグインです。 動作としては unite-haskellimport と同じような感じですね。 どうやっているのかなーと思って Vim script を見てみたら予めテーブルを作って置いて、そこからヘッダーファイルを取得しているみたいですね。 うーん、こういうのが動的に処理出来れば嬉しいですねー。 Boost とかで使いたいし、逆に使ってい

    Vim で自動的にヘッダーを include する - C++でゲームプログラミング
  • C and C++ Code Counter

    CCCC is a tool which analyzes C++ and Java files and generates a report on various metrics of the code. Metrics supported include lines of code, McCabe's complexity and metrics proposed by Chidamber&Kemerer and Henry&Kafura.

  • AdLint

    AdLint is a source code static analyzer. It can point out insecure or nonportable code fragments, and can measure various quality metrics of the source code. It (currently) can analyze source code compliant with ANSI C89 / ISO C90 and partly ISO C99. AdLint is written in Ruby. So, it is available for Windows, Mac OS X, GNU/Linux, FreeBSD and any other platforms supported by Ruby. Features Can poin

    kenichiice
    kenichiice 2012/02/29
    「AdLint は、(現時点では) ANSI C89 / ISO C90 / 一部 ISO C99 規格に準拠した C 言語のソースコードを解析することができます。 」
  • Just another Ruby porter, 2011-2-b

    ■ [ruby-list:47852] Re: ruby1.9での文字列について タイミングを外したのでここで。packなら1.8でも1.9でもいけるはずだ。 % /usr/bin/ruby -rnkf -ve 'p [s1="あ", NKF.nkf("-j",s1)].pack("A*A*")' ruby 1.8.7 (2010-06-23 patchlevel 299) [x86_64-linux] "\343\201\202\e$B$\"\e(B" % ruby -rnkf -ve 'p [s1="あ", NKF.nkf("-j",s1)].pack("A*A*")' ruby 1.9.3dev (2011-02-11 trunk 30836) [x86_64-linux] "\xE3\x81\x82\e$B$\"\e(B" ■ ON bit fixed これは適当に1から順番に生成

    kenichiice
    kenichiice 2011/02/21
    「cppを使ってCのコメントを消す」「gccには-fpreprocessedなんてオプションがあった」