タグ

Cに関するnharukiのブックマーク (34)

  • シグナルハンドラにprintf()を書いてはいけない - Qiita

    三行でまとめると シグナルハンドラ内でprintf()してはいけない というより、余計な処理を書いてはいけない もう一度言う、シグナルハンドラで余計なことをするな、非常に大事なことだ はじめに シグナルハンドラでやってよい処理は非常に限られるのに、全くルールを守らないサンプルコードが世の中に大量に出回っている。printf()するなんてもってのほかなのだが、カジュアルにそこらじゅうで見かけて非常に悲しい。 この記事では、そんな状況を少しでも改善したいと思い初心者向きに書いたものだ。そのため、下記では、回避するにはどう実装すればよいのか、ルールを破るとどうなるのか、といった点を先に簡潔に記述する。 なぜしてはいけないのか、POSIXだとかリエントラントだとか、は下の方に追いやっている。玄人は読んでてウズウズするだろうが、細かい話はできるだけ目につかないような構成としたため了解いただきたい。

    シグナルハンドラにprintf()を書いてはいけない - Qiita
    nharuki
    nharuki 2022/05/11
    一番の解決策はシグナルを意識的に使わない && キャッチしない(発生したら諦めてプログラム落とす)
  • Cの可変長引数とABIの奇妙な関係 - Qiita

    printf に関する以下のツイートが流行っていました。 上のツイートでは割とあっさり説明されていますが、amd64 SysV ABIでこの現象が起こる理由にはもっと深遠なものがあると思うので、可変長引数とからめて説明してみたいと思います。 前提条件として「ABI」「可変長引数」「non-prototyped関数」の知識が必要なのでそこから説明します ABIとは ABI (Application Binary Interface) とは、機械語レベルでのインターフェースのことです。 機械語そのもののルールはISA (Instruction Set Architecture) によって規定されていますが、たとえばC言語の「関数呼び出し」などの概念を機械語でどのように表現するかについては規定していません。そのルールを定めたのがABIです。したがって、ISAとABIはおよそ1対多の関係にあります

    Cの可変長引数とABIの奇妙な関係 - Qiita
    nharuki
    nharuki 2019/09/02
    ABIこわい
  • Conan 2.0: C and C++ Open Source Package Manager

    It works in all operating systems including Windows, Linux, OSX, FreeBSD, and others, and it can target any platform, including desktop, server, and cross-building for mobile (Android and iOS), as well as embedded and bare metal devices. It integrates with other tools like Docker, MinGW, WSL, and with all build systems such as CMake, MSBuild, Makefiles, Meson, SCons. It can even integrate with any

    nharuki
    nharuki 2017/07/19
    C++開発向けパッケージマネージャ
  • C90, C99, C11, C++98, C++11で異なる動作をするコード | POSTD

    (訳注:2016/9/28、頂きましたフィードバックを元に記事を修正いたしました。) C言語の規格のリビジョン間には微妙な違いがありますが、このことを利用して「C90、C99、C11のどれとしてコンパイルされたかどうかにより、違う挙動をする」というプログラムを作ることが可能です。同様に、C++はほぼC言語の上位互換ですが、C言語とC++で違った結果を生み出すプログラムも存在します。 これは2015年の International Obfuscated C Code Contest (難読Cコード・国際コンテスト)への Don Yangの投稿 において、 C89、C99、C11、C++98、C11のどれとしてコンパイルされるかによって異なる出力を生成するプログラムを作成するのに使われています。C90の場合は、以下のような星形を出力します。 **************************

    C90, C99, C11, C++98, C++11で異なる動作をするコード | POSTD
    nharuki
    nharuki 2016/09/14
    闇深…
  • C言語パズル集:Cにまつわる興味深い問題あれこれ | POSTD

    ビジターの皆さんへ C言語に関心を寄せていただきありがとうございます。このページは、C言語の面白い問題、パズルのリストです。これまでに友人たちからeメールで送ってもらったり、で読んだり、インターネットで見つけたり、あるいは自分でC言語でコーディングしていて気づいたりしたプログラムを集めました。 多くのプログラムは、コンパイル、実行され、その振る舞いを示すものです。問題は大まかに次のカテゴリに分けられます。 一般的なタイポエラー。C言語プログラマが頻繁に犯すミスであり、かつ追跡が困難。 初見では非常に理解しがたい小さなプログラム。これらの問題は、他人が書いた優れたコードを読み解く良い訓練になります。 また、全てにGnu/Linux/gccを使っています。掲載順は、それぞれの難易度とは関係ありません。問題解決の助けが必要な場合は、気軽に私に問い合わせてください。連絡先は こちら です。また、

    C言語パズル集:Cにまつわる興味深い問題あれこれ | POSTD
    nharuki
    nharuki 2016/07/27
    後で解く
  • C言語で可変長引数をとる関数を、型安全に書く方法

    C言語の可変長引数は、型安全でない(まちがった型の引数を渡してもコンパイルエラーにならない)とされています。これは言語仕様の理解としては正しいのですが、特定の型の引数を任意の個数とる関数に限っては、マクロを使うことで型安全性を確保することができます。 任意の個数のdoubleを引数にとり、その和を返す関数「sumf」を例にあげて説明します。 C言語の可変長引数機構を使ってsumfを定義すると、以下のようになります。 #include <math.h> #include <stdarg.h> #include <stdio.h> static double sumf(double nfirst, ...) { double r = 0, n; va_list args; va_start(args, nfirst); for (n = nfirst; ! isnan(n); n = va_a

    nharuki
    nharuki 2014/12/19
    地味に便利テクな予感
  • Ideone.com

    Share or Embed source code <script src="https://ideone.com/e.js/prOfEn" type="text/javascript" ></script> Discover > Sphere Engine API The brand new service which powers Ideone! Discover > IDE Widget Widget for compiling and running the source code in a web browser!

    nharuki
    nharuki 2014/09/25
    x86で-O3コンパイル→ディスアセンブルしたら最初のprintfだけ除算命令が無く、最適化の結果即値(0xaf=175)に置き換えられた模様。2つ目は除算命令がある。GCCは最適化時にどういう除算で即値にしているのか…?
  • NS Blog - development blog

    JavaScript (not to be confused with Java) is a flexibleContinue readingJavaScript case Go (often also Golang) is a compiled, multithreaded programming language developed internally by Google. The Go language was designed to create highly efficient programs that run on modern distributed systems and multi-core processors. Go is a strongly statically typed language. Has a fairly concise and simple s

    nharuki
    nharuki 2014/01/29
    定義済みマクロによるプラットフォームの判別方法いろいろ
  • PC覚え書き | プログラムのデーモン化

    VvZX(qvZX)Afork()VXeR[gpBVXeR[oAovZXmAvZXRs[B ovZXevZXARs[VvZXqvZXBevZXAqvZXfork()lpB evZXAfork()qvZXvZXIDpAqvZX0pBplAevZXqvZXッBlBAqvZXPvOヲB int main(void){ pid_t child // fork()li[ if( !(child=fork()) ){ // child=0qvZX printf("inchildprocess\n"); exit(0); } // evZXqvZXID\ヲ prinft("inparentprocess:childprocessID=%d\n,child); return 0; }

  • 2004-11-27

    今日はドラクエ発売日ではないか。と、いうようなことにいまさら気付いた。 specsについては前に調べたと思うんだけど、調べたことが中途半端だったうえになんか今見たら全然わからなくなってたのでメモ。 specsというのは、gccの補助プログラム呼び出し時のルールを書いたファイルのことだ。 gccは実はCコンパイラではなくて、拡張子に応じて、各種言語のコンパイラを呼び出してるだけっていうのは有名な話かと思う。で、そこらへんで各コンパイラを呼び出すときのオプションのルールを書いてあるのがspecsというわけだ。 で、まあ、そういう話はまあ、ふーん、って、ところなんだけど、このspecsがまた無駄なくらい高機能になってたりするので、GCC作ってる人達は変人ばっかだなぁ…と、いうか、素晴らしいと思いました。 まず、手始めに、簡単なところで、 .yes: yes %b こんな感じ。意味は、'yes'っ

    2004-11-27
    nharuki
    nharuki 2011/01/21
    げってぃんぐすたーてっどうぃず "gcc specs file"
  • Spec Files - Using the GNU Compiler Collection (GCC)

    nharuki
    nharuki 2011/01/21
    GCCのデフォルトの挙動を制御するspecファイルのリファレンス
  • 【ハウツー】Cアプリを高速化せよ! - 正式リリースされたgoogle-perftoolsを試す (1) google-perftoolsとは | エンタープライズ | マイコミジャーナル

    google-perftoolsはGoogleによって提供されている、C/C++アプリケーションのパフォーマンスを改善するための開発ツールキットである。2005年3月に初めて公開され、およそ4年を経て7日に正式版がリリースされた。The BSD Licenseの下で提供されており、LinuxをはじめとしてFreeBSD、Mac OS X、Solaris 10、Windows XPなど、各種プラットフォームでの動作が確認されている(ただし、Linux以外については一部機能を除く)。 google-perftoolsには次に挙げる4つのツールが含まれている。 高速メモリアロケータTCMalloc ヒープチェッカー ヒーププロファイラ CPUプロファイラ TCMalloc(Thread-Caching Malloc)は通常のmallocよりも高速なメモリ割り当てを実現するライブラリであり、テスト

  • ネットワークインターフェース情報一覧を取得する(getifaddrs):Geekなぺーじ

    機器に設定されている全てのネットワークインターフェースに付いている、IPアドレス、ネットマスク、ブロードキャストアドレス、フラグなどの情報一覧を取得するには、getifaddrs関数(※システムコールではありません)を利用します。 getifaddrs関数はIPv4とIPv6両方に関する情報をリストとして取得できます。 getifaddrsで取得したifaddrs構造体はfreeifaddrs関数を利用して解放する必要があります。 getifaddrsを利用したサンプルプログラム 以下に、getifaddrsを利用したサンプルプログラムを示します。 フラグ、IPアドレス、ネットマスクを表示しています。 #include <stdio.h> #include <string.h> #include <ifaddrs.h> #include <sys/socket.h> #include <n

  • MinGW - Minimalist GNU for Windows

  • Android NDKを使用してJava言語とC言語で速度比較をする | Techfirm Android Lab

    今回はAndroid NDKを使用して、JavaコードとC言語で記述されたNativeコードで速度の比較を行おうと思います。 まずはNDKをインストールします。以下のリンクからndkをダウンロードします。 http://developer.android.com/intl/ja/sdk/ndk/1.6_r1/index.html ダウンロードしてきたら以下を実行しインストールします。 $(NDKROOT)/build/host-setup.sh これでインストールが完了です。簡単ですね。 早速、Javaのコードを書いて速度比較していきましょう。 今回は簡単に1億回足し算を行い、JavaとNativeで比較してみます。 public class JniTest extends Activity { @Override public void onCreate(Bundle savedI

  • Electric Fenceを使ってみる

    $Id: howto-efence.html,v 1.1 2000/07/05 13:43:38 sakane Exp $ %Hd: Electric Fenceを使ってみる 何? 環境変数 マニュアルで推奨されている使い方 その他 o 何? 自分の技術力を越えたプログラム書く時に超便利なツール。 できる事 o バッファ・オーバーラン o バッファ・アンダーラン o 開放した領域を触る o サイズ 0の malloc を見つけることができる。 コンパイル時に libefence.a をリンクする事で malloc(3)や free(3)を置き換える。 欠点は o 激しくメモリを使う。 o プログラム動作が異常に遅くなる。 何はともあれ使ってみる。 #include #include #include int main() { char *c; c = malloc(4); c[3]

  • J (2006-08-08)堕落したCプログラマのレベル10

    「偽札対応済み」って書いてある両替機。 川口市立中央図書館屋の上にある図書館。に行ってきた。特に何もないけど。あと、マイコンショップ川口つぶれてた。 ある程度能力を持ってるなら、成果を残せるか残せないかは自信を持ってるか持ってないかの違いだけかもしれないというような話。 最近思うのだけど、使えない奴(例えば、僕のような)の特徴として、「どうせ自分が何をどうやっても、何もどうにもならない」的な思考があると思う。 例えば、上の一行で言うと、「使えない奴(例えば僕」とか、そういったような思考。 こういった思考は、いったん根付いてしまうと、循環するので、なかなかやめられない。「どうせ自分は何もできないんだ→何もできないから何もやらない→何も成果を残せない→どうせ自分は何もできないんだ」とかいった感じで。 矯正しようと思っても、「いや、こういう性格だから、矯正は無理だし。」と、いう思考になってし

    J (2006-08-08)堕落したCプログラマのレベル10
    nharuki
    nharuki 2010/08/13
    レベル1にも到達できていなかった
  • Cプリプロセッサメタプログラミングで、文字列系泥沼関数型プログラミング - 簡潔なQ

    今年の文化祭で書いた記事です。 - C言語といえば、いやなイメージ、過去の遺産といった感じがあるかもしれません。 C言語のネガティブな側面というと、やはりポインタやメモリ管理などが難しい、ということが思いつくかもしれません。 しかし、C言語のポインタは表記に騙されやすいだけで、仕組み自体は全く難しくありません。 文法も、どこぞのPerlC++と比べたら屁でもない単純さです。 実のところ、仕様が煩雑で難しいのは、Cプリプロセッサなのであります。 普段からあまり複雑な使いかたをしないから気づかないかもしれませんが、Cプリプロセッサの置換処理は、欺瞞と裏切りに満ちた世界なのです。 これが進化するとテンプレートなどといったもっと面白いものになるのですが、今回はCプリプロセッサで計算をしちゃったりするところまで試しにやってみましょう。 (なお、GCCにより実験的に調べた記事なので、他のCコンパイラ

    Cプリプロセッサメタプログラミングで、文字列系泥沼関数型プログラミング - 簡潔なQ
    nharuki
    nharuki 2010/08/09
    泥沼関数型プログラミングwww
  • 革命の日々! シーケンスロック その5 volatileがダメな理由

    どもども。またまた間隔があいてしまいましたがシーケンスロックな話しの続きです。 前回の記事で坩堝さんから面白い指摘をうけたので今回は予定を変更してvolatileの話をしたいと思います。 retをvolatileにするだけではうまくいかないんですよね? どういう風になるんだろ. なるほど、たしかに世のC言語の参考書を見るとvolatileはある種の最適化を妨げる効果を持つと されています。 これだけ見ると、volatileとつけるだけすべての最適化が無効になってうまく動きそうですね。 しかし、その理屈は微妙におかしいのである 多くの人が「ある種の」という言葉を拡大解釈しているがvolatileは来スレッド同期に使えるようなシロモノではないのである。 つづきは、続きを読むからご覧ください。 あと、お願い。 今回の話は前提知識がいろいろとあるので、末尾のご参考にあげたURLを読んでから 読ん

    nharuki
    nharuki 2010/08/02
    「volatile変数への読み書きはいかなるmemory barrierも張らない」
  • IBM Developer

    IBM Developer is your one-stop location for getting hands-on training and learning in-demand skills on relevant technologies such as generative AI, data science, AI, and open source.

    IBM Developer