株式会社Ninjastars取締役の齊藤です。 皆様もC言語やC++で開発しているときなどに一度はこの実行時エラーを見たことがあるのではないでしょうか? 今回はSegmentation Fault(以下セグフォ)がどのようにして発生するのかを詳細に書いていこうと思います。 1.セグフォとは 割り当てられた仮想メモリ領域(セグメント)に読み込み(r)または書き込み(w)、実行の権限(x)がない状態でアクセスしたときに起こるエラーのことを指します。 では、なぜセグフォが必要なのでしょうか? それはメモリに展開されているプロセスを保護し、OS全体に影響を及ぼさないためです。 2.セグフォの原因を探す手順 プログラムを用意したのでそれを例に原因を探していきましょう。 まず今回のプログラムは標準入力で10byteのbufferに文字データを格納するものです。 標準入力する際、gets関数を使っている
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
規格として C11 (n1570) を参照する。 注意: 途中に入れた図が崩れるようなら、半角・全角比が 1:2 になるようなフォントを使って閲覧してください。 現象 wandbox で実行 ソース: ( &printf)(" &printf = %p\n", &printf); printf (" printf = %p\n", printf); ( *printf)(" *printf = %p\n", *printf); ( **printf)(" **printf = %p\n", **printf); (***printf)("***printf = %p\n", ***printf); この現象を解説する。 関数呼び出し まず、関数呼び出しについての規定を見る。 The expression that denotes the called function shall have
はじめに これは何か / 何がいいのか clang-formatは、主にC++を対象としたソースコード整形ツール(code formatter)である。 ソースコード整形ツールは、ソースコードのフォーマット: コーディングスタイルのうちの見た目に関するものを、一定のルールに従って整形するツールである。ソースコード整形ツールを使うことで、例えばインデントの行い方やカッコの付け方などを手間をかけずに統一できる。チームで開発する際などに、全ソースコードのフォーマットをツールに任せて統一できると、フォーマットに対する好みの差によるソースコードの差分が発生しないため開発効率がよい。 C++用ソースコード整形ツールとして、2022年9月現在で名前がよく知られているのはclang-formatぐらいの様子。 clang-formatでは、整形の行い方をルールファイルで指定する。用意されているスタイル(G
C言語のマクロの引数の最後に ... を指定することで任意個の引数を取り、 __VA_ARGS__ で参照できる:
C/C++プログラム実行時の関数をトレースする方法を紹介します。 1.はじめに C/C++プログラムで実行時の関数をトレースする場合、printf()などを埋め込んでログに出力することが少なくないと思います。 が、その方法ではログ出力するためにプログラムに手を入れなくてはならなず、非効率です。 また規模の大きなプログラムでは現実的な解決方法ではありません。 printf()を埋め込まずにトレースできないか、方法を探していたところ、標準でそのような機能があることをみつけました。 仕組みは、gccでトレースしたいプログラムファイルのコンパイル時に、コンパイルオプション"-finstrument-functions"を付与することで、関数の実行開始時および復帰時に下記のフック関数を呼び出せるようになります。 void __cyg_profile_func_enter(void* func, vo
先に注意事項ですが、今回の話はC言語ソースのコンパイル結果、つまり「処理系での実現方法」の話であって、C言語そのものの決まりではありません。 ※C言語としての話と、コンパイル後のバイナリレベルの話を混同する人が山のようにいるので念のため angel (as ㌵㌤の猫) @angel_p_57 なんかふと思い立ってC言語コードのコンパイル結果を見てみたんだけど、不思議に思ったことが。 const修飾したオブジェクトって実質読み取り専用だから、メモリ上に置かれるとしたら rodata 等の書き込み不可領域になるんだけど。ところが auto変数 ( 要はレキシカルな変数 ) はそうならないようだ。 2023-07-29 21:12:41 angel (as ㌵㌤の猫) @angel_p_57 例えば static const char str[] = "…"; としてstaticなconst文字
Introduction Many implementations provide extensions that allow programmers to attach a block of cleanup code to another block or function such that this cleanup code is executed unconditionally when execution of the block is terminated. These existing extensions don’t have a unified API, some use pseudo-function calls, some compiler specific attributes and yet another a try/finally notion. In a f
libgit2の内部ではハッシュテーブルが使われていたりしますが、C言語標準ライブラリにはハッシュテーブルはありません。ここで公開されている外部のライブラリkhash.hをラップして作られています。コードリーディングメモです。 khashとは何か MITライセンスですが、著者はプロフィールを隠しています。 このブログはanonymousなブログだ ... 俺は完璧主義者だ。もし、読者がこのブログを書いている私を知っているなら、 私は出来る限りすべてを完璧にし続けたいと思うだろう。 それは私を神経質にして、何を書くにしても疲れ果ててしまうだろう。 もし読者が私が誰かを知らないのであれば、自分を解放することができて、 心が赴くままに書き続けられるだろう。 (意訳) こういう厨二病な感じ、嫌いじゃないです。とはいえ、ちょっと古いですがここのエントリーに書かれているベンチマークの結果を見ると、トッ
bashなどの shell では "~/*" "$HOME/*" はホームディレクトリ以下のファイル名に展開されます. これをC/C++で実装する方法です 実装 wordexp(3) を使います #include <wordexp.h> #include <stdio.h> int main(int argc, char *argv[]) { wordexp_t exp; int flags = 0; int ret; ret = wordexp("~/*", &exp, flags); if (0 == ret){ int i; for (i=0; i<exp.we_wordc; i++){ printf("%s\n", exp.we_wordv[i]); } } wordfree(&exp); return 0; } なお wordexp は POSIX.1‐2001, POSIX.1
Section: Linux Programmer's Manual (3) Updated: 2017-09-15 Index JM Home Page roff page 名前 mkstemp, mkostemp, mkstemps, mkostemps - 他と重ならない名前を持つ一時ファイルを作成する 書式 #include <stdlib.h> int mkstemp(char *template); int mkostemp(char *template, int flags); int mkstemps(char *template, int suffixlen); int mkostemps(char *template, int suffixlen, int flags); glibc 向けの機能検査マクロの要件 (feature_test_macros(7) 参照):
NASAは、「宇宙から地球に無線で画像を転送する」といったデータ損失の大きな状況に最適化した画像圧縮アルゴリズム「ICER」を開発しています。そんなICERをC言語のライブラリとして実装したものがGitHubで無料公開されています。 GitHub - TheRealOrange/icer_compression: Progressive, error tolerant, wavelet-based image compression algorithm https://github.com/TheRealOrange/icer_compression NASAは火星探査などのミッションで現地の様子を撮影した画像データを地球へ送信しています。異なる場所へデータを送信する際は、地球上での通信であってもデータの損失が発生しているのですが、地球と火星などの宇宙規模の通信ではデータの損失は非常に大き
問題 ファイルの一覧を出すコマンドって ls しかないんですか。 答え ls は、readdir と stat をしているから遅いんだという話を聞いて、 readdirを使ってファイルの一覧を出力するプログラムをCで書いてみた。 やることは意外と簡単。 1、Cでプログラムを書く $ vi readdir.c #include <stdlib.h> #include <stdio.h> #include <string.h> #include <dirent.h> void main(argc,argv) int argc; char *argv[]; { DIR *dir; struct dirent *dp; char path[512]; if(argc<=1){ strcpy(path,"."); } else{ strcpy(path,argv[1]); } if((dir=ope
C 言語 マクロ講座 # ## 編に触発されて、もうすこし悪戯を。(例によってcygwin+gcc) htmlでは、” (ダブルクォート)が多用されているので、cgiプログラムでは、文字列として定義するときにエスケープする必要があり面倒です。<h1 id=”title”>hello</h1> は、”<h1 id=\”title\”>hello</h1>” として定義しなければなりません。このおかげで、Starbug1のソースは大変なことになってます。普通ならテンプレートエンジン書け!ってことになるんでしょうが、Starbug1の性質上余分なことはしたくないので、現在htmlをエスケープしながら直書きしてます。 プリプロセッサで処理する方式で、エスケープせずにhtmlを記述できるようになると非常に嬉しいので、# を使ってヒアドキュメント風なものを試してみました。最初試したのは、↓のような感じ
概要 ファイル名のリストだけ高速に欲しいみたいな場合に大量にファイルがあるディレクトリでlsを打って返ってこないみたいなのが地味にストレスになったりするので高速に済ませる手段が無いかを調べてみた。 1ディレクトリに100万ファイル程度 計測前にecho 3 > /proc/sys/vm/drop_cachesを都度実行し10回程度計測 計測 ls -l めっちゃ遅い real 0m24.052s user 0m5.668s sys 0m8.071s straceをしてみるとこんな感じ。-lをつけるとメタデータを取りに行くのでこれが遅いらしい。sysが長い % time seconds usecs/call calls errors syscall ------ ----------- ----------- --------- --------- ---------------- 44.6
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く