mmap はファイルとメモリーアドレスのマッピングを行う mmap をしてもファイルデータが物理メモリーへ即ロードされない(レイジー最適化) データが物理メモリーにロードされてるかは MMU(メモリー管理ユニット)が検知してページフォルトを生成する OS カーネルがページフォルトをインターセプトしたら、やっとファイルデータはメモリーにロードされる mmap は Linux でファイルとメモリーのアドレスを紐付けて(マップして)、ファイルをメモリーかのようにアクセスできるようにしてくれる関数です。 基本的な用途としてはメモリーの中身をハードディスクの中にあるファイルにバックアップを高い頻度でとりたい場合ですかね。 もしくはディスク内のファイルを配列・バッファーのように読み込みたいとかです。 まあ必ずしもファイルをマップする用途に限定されるわけじゃないですが、ここはお急がしい読者さんのために分
mmapでMAP_FIXEDを利用する方法を紹介します。 1.はじめに mmapはファイルの内容をメモリにマップするC/C++の関数です。 mmapの引数は、 void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset); となっています。各引数の意味は次のとおりです。 addr:新しいマッピングの開始アドレス length:マッピングの長さ prot:マッピングのメモリ保護 flags:マッピングに対する更新の見え方 offset:マッピング開始位置 manによるとmmapは次のような動作になります。 addr が NULL の場合、カーネルがマッピングを作成するアドレスを選択する。この方法は最も移植性のある新 しいマッピングの作成方法である。 addr が NULL でない場合、カーネル
C/C++の静的解析は、どう考えても大変なんだけどどう考えても需要が高いので、やはり色々なソフトウェアや事例があるようだ。まとまった情報が欲しいけど見つからなかったので自分の調べた範囲でまとめることにした。 他にも耳寄りな情報があったら教えてほしい。 静的解析を行うことができるソフトウェア 調べてみると結構たくさんある。それぞれの特徴とかあまりよくわからない。 (個人的には、とりわけ網羅的な形式的検証ができるツールの性能に興味があるので、それを中心に集めていたが、やはり網羅的とは限らないで探すともっとたくさん見つかるようだ。もちろん網羅性にはトレードオフがある) Frama-C …… C言語に形式手法を適用するための汎用のフレームワークで、静的検証のためのプラグインも多数(WPとかValueとか)存在する。網羅的な検証から発見的な手法、動的な手法まで様々ある。研究で使うのに便利そう Ast
使い方 まずは定番なHello Worldから。 #include <stdio.h> int main(void) { printf("Hello World\n"); return 0; } コンパイル時には'-g'オプションを忘れずに。 $ gcc -g -o hello hello.c $ ./hello Hello World Valgrindの使用方法は、valgrindコマンドに実行コマンドを渡します $ valgrind ./hello ==30444== Memcheck, a memory error detector ==30444== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al. ==30444== Using Valgrind-3.11.0 and LibVEX; rerun wit
プログラム実行経路上のメモリリークを検出するツールです。 mallocやnewを独自の関数に置き換え、メモリ領域の確保と同時に呼び出し情報を保持しておき、プログラム終了時に解放されていない呼び出し元を出力します。 以下のようなmallocされた領域がfreeされないコードを使います。 #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { char *buffer = (char *) malloc(1024); if (buffer == NULL) return 1; buffer[0] = 1; /** free(buffer); */ return 0; } コンパイル後、valgrindにかけてみます。 $ valgrind --leak-check=full ./memleak ==30
==23525== Invalid free() / delete / delete[] / realloc() ==23525== at 0x1000089DF: free (in /usr/local/Cellar/valgrind/HEAD/lib/valgrind/vgpreload_memcheck-amd64-darwin.so) ==23525== by 0x100000F4F: main (sample.c:8) ==23525== Address 0x10081f510 is 0 bytes inside a block of size 4 free'd ==23525== at 0x1000089DF: free (in /usr/local/Cellar/valgrind/HEAD/lib/valgrind/vgpreload_memcheck-amd64-darwi
C言語はもうかれこれ10年くらい書いていないけど、流石にこれはヤバい。 正直な感想として、ブランド毀損するくらいの危険性をはらんでいると思う。 当該記事からコピーしてきた。 #include <stdio.h> #include <stdlib.h> // 構造体の宣言 typedef struct { int num; char *str; } strct; int main(void) { // 実体を生成 strct *entity; // 動的メモリの確保。確保したメモリをstrct型ポインタにキャスト。 entity = (strct*)malloc(sizeof(strct)); // メンバの初期化 entity->num = 0; entity->str = (char*)malloc(sizeof(32)); // メモリに文字列を代入 sprintf(entity->s
メモリ解放漏れ・メモリ二重解放は組込みエンジニアにとって、背筋が凍る単語だ。 それは、即、残業しなさいという意味に転じる。 そこから、泥沼のデバッグにハマることがよくある。 そんな課題をスマートに解決するために、メモリ解放漏れやメモリ二重解放を検出するツール調べてみたので、メモメモ。 オープンソース CppCheckのインストールをしよう# Cppcheckを使うことでメモリ解放漏れを静的解析で見つけることが可能だ。CppCheckはその他にも、アロケーション(確保と解放)の不一致(メモリ二重解放),バッファオーバーランの検出ができる。OSSなので、誰でも無料で利用可能。 CppCheckのダウンロードはココから Cppcheckの使い方の日本語訳は、以下のサイトで公開されている。 (ものすごく感謝!)今回はこれを参考に自分でも試してみる。 cppcheck 日本語マニュアル - 一人ぼっ
インクルードするだけで使えるNon-movingで正確なGCをC言語用に作りました。 行数がコメントを除いて100行に満たない非常に小さなライブラリです。 GCのアルゴリズムとしてはCheneyのコピーGCを採用しています。 通常のCheneyのコピーGCではメモリ空間のうち半分が無駄になってしまいメモリ効率が悪かったり、 GC発生時にオブジェクトが移動してしまいC言語のようなポインタを直接触れる言語との相性が悪いという欠点がありました。 今回はヒープ全体を二重連結リストとして管理することでそのような問題を解決しています。 ちなみにこれはTreadmill GCのアイデアと同じです。(が、アルゴリズム自体はTreadmill GCではありません。) APIはLinuxのlist.hに非常に近い見た目になっています。 ある構造体をgcで管理したい場合はstruct gc_head型のメンバを
なにか、無闇に時間掛かってしまった・・・ 後で見直して直すと思います。 数あるmallocアルゴリズムの基本であるK&Rのmallocアルゴリズムを解説いたします。 K&Rとは初期のC言語を解説した書籍「プログラミング言語C」(原題:The Programing Language)のことです。 著者であるブライアン・カーニハン氏(Brian W. Kernighan)とデニス・リッチー氏(Dennis M. Ritchie)の頭文字をとってK&Rと呼ばれています。 malloc関数とはヒープ領域から、指定したサイズのメモリを動的に確保する関数です。 C言語などの低レベルの処理を記述する言語では馴染みのある関数です。 Javaなど低レベルの処理を記述しない言語しか使用していない人には、あまり馴染みがないでしょうか? malloc関数で確保したメモリは対応するfree関数で解放いたします。 明
勉強がてらメモ。 適宜更新していこう。うん。 Valgrindって? デバッグやプロファイラなどの複数のツールから構成されるツール群の総称。 メモリリークチェックツールとして有名だと思いますが、 それはValgrindツール群の中のMemcheckというツールによる機能だったのですね。 どんなツールがあるのか?マニュアルを見ると・・・ Memcheck 言わずと入れたメモリエラー検出ツール。特にC/C++に向いている。リークチェックやバッファーオーバーランなどね。 Cachegrind プログラムのキャッシュグラフ、または分岐予測をしてシミュレートする。プログラムを速くするために使うツール。 Callgrind 関数呼び出しをトレースしたりできる。Cachegrindをかぶる部分もあるが、Cachegrindとは別の情報も収集できる。 Helgrind マルチスレッドのプログラム向け。スレ
次のようなプログラム test.c について考える: #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <string.h> struct test { int32_t len; int8_t buf[16]; }; int main(int argc, char *argv[]) { struct test *p = malloc(sizeof(struct test)); int8_t buf[16]; p->len = sizeof(p->buf); bzero(p->buf, p->len); printf("0x%lX-0x%lX => 0x%lX\n", (long)p->buf, (long)p->buf+p->len-1, (long)buf); bcopy(p->buf, buf,
Memcheck is a memory error detector. It can detect the following problems that are common in C and C++ programs. Accessing memory you shouldn't, e.g. overrunning and underrunning heap blocks, overrunning the top of the stack, and accessing memory after it has been freed. Using undefined values, i.e. values that have not been initialised, or that have been derived from other undefined values. Incor
以前の記事にもLinuxでのメモリーリークの検出に関する事を書いたのですが、もう少し一般的なやり方を紹介しましょう(というより、自分で毎回忘れるので備忘録として・・・)。 【mtraceを使う方法】 まず、mtraceを使う方法です。リークのテストを開始したい場所でmtrace()をコールし、終了したい場所でmuntrace()をコールするようにします。 #include <stdio.h> #include <stdlib.h> char *test() { char *test=malloc(10); return(test); } int main() { char *ptr; mtrace(); ptr=test(); //*(ptr+10)='\0'; //free(ptr); muntrace(); return(0); } -gつきでコ
Information About News Tool Suite Supported Platforms The Developers Source Code Current Releases Release Archive Variants / Patches Code Repository Valkyrie / GUIs Documentation Table of Contents Quick Start FAQ User Manual Download Manual Research Papers Books Contact Mailing Lists and IRC Bug Reports Feature Requests Contact Summary Commercial Support How to Help Contributing Project Suggestion
前回の記事で警告してみましたが 2名の方がそれでも熱心に 「ハッキングについて教えてください」メールを お二人合わせて9通もくださいましたので 試しに"なぜハッキングなるものが成立するか"という内容で 記事を書いてみようと思います。 まず初めに注意から ・今回紹介するプログラムはわざと脆弱性を含めたコードを 自作しますが、同じ脆弱性は現在でも数多く発見されています。 絶対にこの記事で得た知識を悪用することは止めてください。 この記事の知識を悪用して発生したいかなる問題について 当ブログは責任を持ちません。あくまで"知識"として知っている ことは無駄ではないと思います。 ・この記事の内容を理解するにはC言語を扱えること超基本的な アセンブリの知識があること。そしてCPUレジスタとメモリの扱いを 理解している必要があります。 **********************************
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く