タグ

ブックマーク / pyopyopyo.hatenablog.com (19)

  • コンパイラのAddressSanitizerを使ってバッファ オーバーフローを退治する - pyopyopyo - Linuxとかプログラミングの覚え書き -

    C言語やC++の欠点の一つは,バッファオーバーフローやオーバーランが起こりやすいことです. それは欠点であると同時にC/C++の利点であると言う人もいます.つまり,メモリ関連のチェックを省略することで,省略した分C/C++はオーバヘッドが少ない高速なプログラムが生成できるというものです.しかしバッファオーバーフローやオーバーランはプログラムのクラッシュやセキュリティホールを招く危険な「バグ」であることには変わりありません. そこで最近のC/C++のコンパイラはコンパイル時のオプションでオーバーフローのチェックをOn/Offできるようになっています. オプションは大雑把に分類すると コンパイル時に,静的に,オーバーフローのチェックするもの 実行時に,動的に,オーバーフローのチェックするもの に大別できます. これらオプションのデメリットは コンパイル時のオーバヘッドが増える.つまりコンパイル

    コンパイラのAddressSanitizerを使ってバッファ オーバーフローを退治する - pyopyopyo - Linuxとかプログラミングの覚え書き -
    Wacky
    Wacky 2024/06/11
  • C言語をマスターしたい人はGCCのバージョン14を使いましょう - pyopyopyo - Linuxとかプログラミングの覚え書き -

    C言語(C++を含む)を習得したい人,ポインタを勉強したい人はgcc-14を使いましょう.難しいところは gcc-14 が丁寧に解説してくれます C言語の難しいところ 例を示します.C言語で記述された,たった6行のソースコードです int main() { int buf[10]; buf[10] = 0; return 0; } このソースコードには問題があります.初見でわかるでしょうか? : : : 問題があるのは buf[10]=0 の部分です.C言語でやりがちなミスですが,これがバグやセキュリティホールの原因になります. C言語が難しい理由は二つあります.この手の問題を見逃しやすい点と,この手の問題を理解することが難しい点の二つです gcc 14 に解説してもらいましょう 上記の6行のソースコードをgcc14を使ってコンパイルしてみます ソースコードのファイル名は test.c と

    C言語をマスターしたい人はGCCのバージョン14を使いましょう - pyopyopyo - Linuxとかプログラミングの覚え書き -
    Wacky
    Wacky 2024/06/11
  • 任意精度計算ライブラリ(GMP)の使い方 - pyopyopyo - Linuxとかプログラミングの覚え書き -

    プログラミング時に注意すべき点の一つに,計算精度の問題があります. たとえばC/C++だと,doubleで計算しても有効桁数は15桁程度(10進数で)しかありません.その結果,以下のような状況で間違った計算結果が出てしまいます. 取り扱う数値が15桁を越える場合 取り扱う数値が7桁を越える場合 たとえば8桁同士の掛け算が行われるとその結果は最大16桁になります.double型の変数には15桁程度の情報しか保存できないので,下位1桁の情報は棄てられます. 取り扱う数値の最大値と最小値に,15桁の以上の差がある場合 たとえばC言語のdouble型で(1.0 + 1e-16)を計算すると結果は 1.0 になります. これら計算精度の問題を避ける方法の一つにGMPというライブラリを使う方法があります。以下ポイントをまとめます。 GMPとは GMP(GNU Multiple Precision li

    任意精度計算ライブラリ(GMP)の使い方 - pyopyopyo - Linuxとかプログラミングの覚え書き -
    Wacky
    Wacky 2019/10/27
  • c++のデバッグをするならgdb-6.8を使いましょう。 - ぴょぴょぴょ? - Linuxとかプログラミングの覚え書き -

    2008年の3月にリリースされたgdb-6.8の目玉機能の一つに「C++サポートの強化」があります*1。この機能を使うと、STLやboostのようなテンプレートを使ったコードのデバッグがかなり楽になります。C++使いの方は、是非gdbを6.8にupgradeしましょう。 具体的に、以下のようなコードを使って、「C++サポートの強化」について説明します。 #include <iostream> using namespace std; template <typename T> class A { public: void func() { cout << sizeof(T) << endl; } }; int main() { A<int> integer; A<double> real; integer.func(); real.func(); return 0; } このコードに対して

    c++のデバッグをするならgdb-6.8を使いましょう。 - ぴょぴょぴょ? - Linuxとかプログラミングの覚え書き -
    Wacky
    Wacky 2008/04/24
    gdb-6.8の目玉機能の一つに「C++サポートの強化」があります*1。この機能を使うと、STLやboostのようなテンプレートを使ったコードのデバッグがかなり楽になります
  • screenに関するtips - Linuxとかプログラミングの覚え書き -

    unix使いには、便利なscreenですが、トラブルもあります。 トラブル毎に原因と解決方法を整理してみました。 以下、screen の コマンドキーは、 デフォルトの "C-a" であるとします。設定で別のキーにしている場合は適宜読み替えてください。 時々フリーズする 症状: screen 経由で emacs を使っていると端末がかたまる場合がある。C-x C-s や C-s を押すと固まる。 症状: 時々フリーズする。キーを受け付けなくなる。C-q や C-a C-q を押すと復帰する。 原因: "C-a f"を押すなどして、フロー制御が有効なモードに切り替わったため。 解決方法: "C-a f"を押し、フロー制御をOffにすれば良い 参考URL: http://kyoto.cool.ne.jp/kinoka/pc/screen.html http://uragoya.com/2007

    screenに関するtips - Linuxとかプログラミングの覚え書き -
    Wacky
    Wacky 2008/04/05
  • svn でタグを付けるとHDDはどれくらい消費されるか? - pyopyopyo - Linuxとかプログラミングの覚え書き -

    svnはファイルシステムのように見せているだけで,ちゃんと内部では差分を管理しているのだよね・・・と少々不安になったので,試しに copy コマンドでタグを付けて,HDDの消費量をしらべてみた. まず,タグを付ける( tags/ 以下にcopy を取る)前の リポジトリのサイズ $ du -k 4 ./dav 12 ./locks 24 ./hooks 8 ./conf 1888 ./db 1948 .タグを付けたあとでは, $ du -k 4 ./dav 12 ./locks 24 ./hooks 8 ./conf 1896 ./db 1956 .ファイル・ディレクトリは全部で70程度あるので,ファイル一つにつき100Bytesぐらい使うのかな?

    svn でタグを付けるとHDDはどれくらい消費されるか? - pyopyopyo - Linuxとかプログラミングの覚え書き -
    Wacky
    Wacky 2007/09/22
  • linuxで時刻を取得する方法 - pyopyopyo - Linuxとかプログラミングの覚え書き -

    linuxで時刻を取得する方法について調査した.(2006/7/17更新) 時刻を取得する方法としては システムコールを呼び出し,時刻を管理しているデバイス(RTCとかカーネル内部のオブジェクト)を読む方法 userlandから直接CPUが持っているクロックのレジスタを読む方法(x86だとRDTSC命令) がある.両者は 移植性が高い.オーバヘッドが大きい 移植性が低い.オーバヘッドが小さい. という関係にある.また後者の方法を取る場合は,CPUが複数あるSMP環境では,CPUが持っているクロックのレジスタが同期していないことも考慮しなければならない. glibcが提供するAPIと,その内部の動作をまとめてみる. time_t time(time_t *tloc); 精度が悪いので調査は省略 int ftime(struct timeb *tp); 精度が悪いので調査は省略 int get

    linuxで時刻を取得する方法 - pyopyopyo - Linuxとかプログラミングの覚え書き -
  • C99における浮動小数点演算の計算精度(その1) - pyopyopyo - Linuxとかプログラミングの覚え書き -

    C99では,FLT_EVAL_METHOD というラベルの値で,浮動小数点演算の計算精度が制御できる. FLT_EVAL_METHODの値と保証される精度の関係は以下の表の様になる. FLT_EVAL_METHODの値 float型が保証する精度 double型が保証する精度 0 float double 1 double double 2 long double long double その他 未定義 未定義 この計算精度がどういう意味を持つかというと,たとえばFLT_EVAL_METHODが1に設定されている場合は float a; float b; float c=a*b;というソースは,コンパイラにより float c=(double)a * (double)b;というコードに変換される.(少なくともx86では) floatは仮数部24bit,doubleは仮数部53bit, lo

    C99における浮動小数点演算の計算精度(その1) - pyopyopyo - Linuxとかプログラミングの覚え書き -
    Wacky
    Wacky 2007/09/21
  • gdbでSTLのコンテナの値を表示する方法 - pyopyopyo - Linuxとかプログラミングの覚え書き -

    STLを使ったコード,たとえば std::vector<int> array;というコードがあったとして,gdbでデバッグ中に array[0] の値を確認したい場合はどうするか?実はこれが結構面倒なのだ. gdbでデバッグ中に,変数の値を確認したい場合は print コマンドを使う.例えば int a=12;というコードがあって,変数 a の値を表示させたい場合は gdb のコマンドラインで (gdb) print a とする.printコマンドは p と省略して記述できるので,通常は" p a "で確認する.さらに,変数が配列の場合なら "p 変数名[添字]" となる. 以上をふまえると, std::vector<int> array;というコードがあったとして,先頭の array[0] の値を確認したい場合は (gdb) p array[0]とやってしまう訳なのだが,結論からいうとこ

    gdbでSTLのコンテナの値を表示する方法 - pyopyopyo - Linuxとかプログラミングの覚え書き -
  • software raid の復旧手順 - pyopyopyo - Linuxとかプログラミングの覚え書き -

    redhat/whitebox/fedora 系でsoftware raidを復旧する手順は以下の通り. 下準備 状況を把握する $ cat /proc/mdstatたとえば以下のような出力が得られた場合,md1を構成しているsda5の領域が壊れている. Personalities : [raid1] read_ahead 1024 sectors md0 : active raid1 sda1[1] sdb1[0] [2/2] [UU] md1 : active raid1 sda5[1] sdb5[0] [2/1] [_U]つまり,正常なユニットは "U",異常のあるユニットは "_" で表現されている. パーティション情報の収集 $ fdisk -l /dev/sdb ソフトウェアRAIDではパーティション情報の復元まではしてくれない.作業を始めるまえにパーティション情報を確認してお

    software raid の復旧手順 - pyopyopyo - Linuxとかプログラミングの覚え書き -
    Wacky
    Wacky 2007/09/21
    redhat/whitebox/fedora 系でsoftware raidを復旧する手順は以下の通り.
  • linux2.6でDMA転送する方法 - pyopyopyo - Linuxとかプログラミングの覚え書き -

    久しぶりにPCIデバイスでDMA転送するドライバ(linuxのカーネルモジュール)を書いたので,メモ. 以下,論理アドレスと,物理アドレスは以下のように表記する. dma_addr DMAアドレス(物理アドレス,バスアドレスとも) cpu_addr CPUアドレス(論理アドレス) DMA関連のAPIlinux/pci.h にて定義されている. まず,DMA用のバッファを確保するAPI struct pci_dev *dev; dma_addr_t dma_addr; void *cpu_addr; cpu_addr = pci_alloc_consistent(dev, size, &dma_addr) 解放は pci_free_consistent(dev, size, cpu_addr, dma_handle); cpu_addr から struct page を取るAPI str

    linux2.6でDMA転送する方法 - pyopyopyo - Linuxとかプログラミングの覚え書き -
    Wacky
    Wacky 2007/09/21
  • Makefile は簡潔に書きましょう - pyopyopyo - Linuxとかプログラミングの覚え書き -

    仕組みが判ってしまえば Makefile は簡潔に書けます.$(CC) とか $@ とか $< なんて変数は使ったら負けです. 基(その1) ソースコード hoge.c から 実行形式のバイナリ hoge を生成するMakefileは,以下のように書きましょう all: hogeこれだけです.これで $ make all とすると hoge が生成されます 重要な点は,間違っても all: hoge hoge: hoge.c $(CC) hoge.c -o hogeのようなMakefileを書かないことです.このようなMakefileでは #!/bin/sh CC=gcc $CC hoge.c -o hoge というようなシェルスクリプトと同程度の使い勝手しかありません. 基(その2) ここで例えば-O3 を付けてコンパイルしたい場合や,-lm を付けてリンクしたい場合は以下のようにし

    Makefile は簡潔に書きましょう - pyopyopyo - Linuxとかプログラミングの覚え書き -
    Wacky
    Wacky 2007/09/21
  • ぴょぴょぴょ? - Linuxとかプログラミングの覚え書き - - c/c++でsqliteを使う方法

    sqlite3をc/c++で使う方法についてメモ。 以前rubysqlite を使う方法 - ぴょぴょぴょ? - Linuxとかプログラミングの覚え書き -でも書いたように、DBを使うアプリケーションは、通常はrubyなどのスクリプト言語で記述したほうが楽です。 でもc/c++からもデータベースを使えると非常に便利です。 公式なリファレンスマニュアル http://www.sqlite.org/capi3ref.htmlAPIの一覧があります インストール debian であれば libsqlite3-dev を入れるだけです. $ sudo apt-get update $ sudo apt-get install libsqlite3-dev sqlite3 のAPI よく使うAPIを列挙していきます Database への接続 データーベースとして、 hogehoge.db

    ぴょぴょぴょ? - Linuxとかプログラミングの覚え書き - - c/c++でsqliteを使う方法
    Wacky
    Wacky 2007/09/21
  • ダウンタイムをできるだけ短くして、サーバのHDDを交換する方法 - pyopyopyo - Linuxとかプログラミングの覚え書き -

    ダウンタイムをできるだけ短くして、サーバのHDDを交換する方法。 手順は5段階 サーバに新しいHDDを接続し、フォーマットして、マウントする サーバを稼動させたまま、rsync を使って新しいHDDにデータをコピーする サービスを止めて、再度 rsync を使って新しいHDDにデータをコピーする 新しいHDD側にブートローダをインストールする あとはHDDを交換するだけ 手順1〜3までについては昨日のエントリダウンタイムをできるだけ短くして、サーバのHDDを丸ごとコピーする方法 - ぴょぴょぴょ? - Linuxとかプログラミングの覚え書き -を参照。 最後の、ブートローダのインストールは grub を使っている場合なら # /sbin/grub-install --root-directory=/mnt/usb /dev/sdb とする。ただし、 "/mnt/usb" は新しいHDDをマ

    ダウンタイムをできるだけ短くして、サーバのHDDを交換する方法 - pyopyopyo - Linuxとかプログラミングの覚え書き -
    Wacky
    Wacky 2007/09/21
    ダウンタイムをできるだけ短くして、サーバのHDDを交換する方法。
  • STLのalgorithm,functorの使い方. - pyopyopyo - Linuxとかプログラミングの覚え書き -

    STLのalgorithm,functor 関連をシンプルに整理してみました. 以下,文中の op は関数オブジェクト T, T1,T2 はtypename a, b はT型の定数 x, y はT型の変数 or 定数 Ite,first, last はイテレータ とします. equal_to, not_equal_to, greater, less, greater_equal, less_equal 書式 生成されるコード greater()(x, y) x > y less()(x, y) x < y greater_equal()(x, y) x >= y less_equal()(x, y) x <= y equal_to()(x, y) x == y not_equal_to()(x, y) x != y bind1st, bind2nd 書式 生成されるコード bind1st(

    STLのalgorithm,functorの使い方. - pyopyopyo - Linuxとかプログラミングの覚え書き -
    Wacky
    Wacky 2007/09/21
  • Changelogのための英文テンプレート集 - ぴょぴょぴょ? - Linuxとかプログラミングの覚え書き -

    Changelog英語で書く際に参考になるようなテンプレートをまとめてみました.git や svn のコミットログにも使えます. このエントリは今後も逐次更新を続けます(最終更新2018/11/01) リリースノートの英文についてはRelease note のための英文テンプレート集 - pyopyopyo - Linuxとかプログラミングの覚え書き -に分離しました git等のcommit メッセージにも使えます 以下,例文. バグ修正した場合 修正した場合 → fix を使うのが定番です Fixed a performance regression. (パフォーマンスが低下するバグを修正しました) Fix possible memory leak Fixed an issue where some devices would display the wrong image. (いく

    Changelogのための英文テンプレート集 - ぴょぴょぴょ? - Linuxとかプログラミングの覚え書き -
  • ぴょぴょぴょ? - Linuxとかプログラミングの覚え書き - - make の仕組みを理解する

    前述*1のように Makefile は非常に簡潔に記述できます.ただし,簡潔なMakefileを記述するためには make の仕組みを理解する必要があります. 結論から言うと, make は 簡潔な生成ルールのみを記述したMakefileから, 実際に必要となる詳細な生成ルールを自動的に生成します. 自動的に生成されたルールを確認するには $ make -p と "-p" オプションを付けて make を実行します. 以下, hoge.c から hoge を生成する場合 hoge.c と fuga.c から hoge を生成する場合 の二つの具体例を挙げて,説明します. 前準備 Makefile と hoge.c を用意します. Makefile all: hoge hoge.c int main() { return 0; } make -p の実行 $ make -p > log 大量

    ぴょぴょぴょ? - Linuxとかプログラミングの覚え書き - - make の仕組みを理解する
    Wacky
    Wacky 2007/02/20
    結論から言うと, make は 簡潔な生成ルールのみを記述したMakefileから, 実際に必要となる詳細な生成ルールを自動的に生成します.
  • 壊れたHDDからデータを取出す方法 - ぴょぴょぴょ? - Linuxとかプログラミングの覚え書き -

    停電とか,寿命でHDDが壊れてしまった場合,せめて残っているデータだけでも取出したい・・・そういう泣きそうな状況に陥った人向けの作業メモ. 概要としては,例えばCDROMをCDRへコピーする際には, 一度 CDROMからデータを吸い出してISOイメージをつくって ISOイメージをCDRへ書き込む という作業をする.同じように 壊れたHDDからデータを吸い出して 新しいHDDへ書き込む という作業手順で,破損したHDDから残っているデータが救出できる.以下,具体的な作業手順についてまとめる. 状況を把握する たとえば dmesg で以下のようなエラーが出ている場合は end_request: I/O error, dev 03:42 (hdb), sector 31719462 hdb: read_intr: status=0x59 { DriveReady SeekComplete Dat

    壊れたHDDからデータを取出す方法 - ぴょぴょぴょ? - Linuxとかプログラミングの覚え書き -
    Wacky
    Wacky 2006/11/20
    出来るだけ多くのデータを救出するためには実HDDに対してはfsckは絶対に実行しないというのが最大のポイントである.
  • C言語でxmlを読み込む - pyopyopyo - Linuxとかプログラミングの覚え書き -

    C言語でxmlを読み込む方法についてメモ.ライブラリはlibxml2 を使った. xmlをパースするAPIには,大きくわけてSAXとDOMの2種類ある.両者を比較すると以下のようになる. SAX (Simple API for xml) DOM (Document Object Model) メモリ消費量 少ない 多い xml中の各要素へのアクセス方法 シーケンシャル・アクセス ランダム・アクセス libxml2のSAX型のAPIとしては xmlReader がある.xmlReaderの使い方は,http://xmlsoft.org/examples/index.html#xmlReaderにあるサンプルコードを見ると良い. 大まかな使い方は以下の通り xmlTextReaderPtr reader; reader = xmlNewTextReaderFilename("hogehoge.

    C言語でxmlを読み込む - pyopyopyo - Linuxとかプログラミングの覚え書き -
    Wacky
    Wacky 2006/05/14
    C言語でxmlを読み込む方法についてメモ.ライブラリはlibxml2 を使った.xmlをパースするAPIには,大きくわけてSAXとDOMの2種類ある
  • 1