実験してみた

delete this の安全性

メンバー向けトレーニングネタその1。delete this は危険に見えるが何を削除しているのか確認する。 class ClassA { public: void del() { delete this; } }; int main() { ClassA* ptr = new ClassA(); ptr->del(); // ダメな例 // ClassA test; // test.d…

C++ でオーバーライドした仮想関数をコンストラクタで呼ぶ

ClassA の仮想関数 method() を継承した ClassB でオーバライドした場合でも ClassA のコンストラクタ内の method() は ClassA::method() を指している。これは vptr の初期化タイミングで説明できると思っていたが違った orz(以下、ubuntu 64bit 環境で試…

switch 文の default のスペルは間違えてはいけない

http://codepad.org/jnZoVbI1を見て試してみた。 #include <stdio.h> int main(void) { int x = 2; switch (x) { case 1: printf("1\n"); break; defautl: printf("other\n"); break; } return 0; } gcc でコンパイルは通るが結果が 1 も other も表示されない。-Wall</stdio.h>…

error: duplicate 'unsigned'

仕事で stdint.h 内部の typedef でコンパイルエラーになる謎報告があった。ログから推測して以下のような状況だったのだと思う。 #define uint32_t unsigned int typedef unsigned int uint32_t; .cpp ならば、 test.cpp:3: error: duplicate 'unsigned' te…

新型 iPod Touch をバラしてみた

参考にしたところ。 http://www.ifixit.com/Guide/First-Look/iPod-Touch-2nd-Generation/586/1 http://techon.nikkeibp.co.jp/article/NEWS/20081009/159383/ 以下、補足になりそうなところだけメモを残す。 ガラスカバー(タッチパネル) 旧型はディスプレ…

Debug Hacks Conference 2009 (LD_PRELOAD を使った gdb 拡張)

http://atnd.org/events/539とても面白かった。知らなかったことがあったのでさっそく家で試してみた。 素性の分からないファイルの調べ方 大岩さんの発表で rpm -qf で所属パッケージを調べ、rpm -ql で関連ファイルを調べるという方法が紹介されていた。ub…

main を蹂躙する Hello, world!

http://d.hatena.ne.jp/yupo5656/20061215に書かれている Hello, world! で遊んでみました。そのままだと、ubuntu amd64 だとデフォルトでデータ実行不可になっていてセグってしまう。http://en.wikipedia.org/wiki/NX_bit.plt セクションに配置すると良いら…

SlideShare のアップロードしたスライドの URL の決まり方を調べてみた

ホントどうでもいいことだ・・・w ウェブからアップロードした場合 タイトルを半角英数で "hoge foo bar" とした場合 http://www.slideshare.net/username/hoge-foo-bar-presentation スペースはハイフンに置き換わる 最近は末尾に -presentation が必ず付くよ…

ガウシアンフィルタで写真をミニチュア風に加工する

画像処理の話をしていたら、以下のような記事を教えてもらった。 http://pingmag.jp/J/2006/03/07/10-tiny-tokyo-photos/実際にはチルトシフトレンズというものを使って撮影するそうだが、擬似的に Photoshop でも加工できるとあるので試してみた。Google 画…

C/C++ でのグローバル変数の関数による初期化

以下のグローバル変数を関数で初期化するコードは C++ でコンパイルできて動作するんですね・・・ #include <stdio.h> int initializer() { return 12345; } int g_int = initializer(); int main(int argc, char** argv) { printf("g_int = %d\n", g_int); return 0; } </stdio.h>…

参照型のクラスメンバ変数

has-a はポインタを使うことが多くて曖昧な知識だったが、参照型のクラスメンバ変数は初期化子で初期化すれば利用できる。 class test { public: test(int& val) : m_val(val) {} // OK test(int val) : m_val(val) {} // OK // test() {} // test.cpp:6: er…

amd64 環境での PTR_MANGLE/PTR_DEMANGLE の実装を確認してみた

glibc-2.7 のソースコードで確認した。以下は jmp_buf から実際のアドレスを抜き出すテストプログラム。 #include <stdio.h> #include <setjmp.h> #define PTR_DEMANGLE(var) asm("rorq $17, %0;" \ "xorq %%fs:0x30, %0;" : "=r"(var) : "0"(var)) int main(int argc, char** a</setjmp.h></stdio.h>…

PTR_MANGLE/PTR_DEMANGLE の実装は xor + ror/rol になっていた

マイクロスレッドの実装で、%ESP と %EIP の切り替えに setjmp()/longjmp() を利用しようとしたらハマってしまった。調べてみるとセキュアコーディングの関係で jmp_buf の %EIP, %ESP のポインタがエンコーディングされていた。 http://d.hatena.ne.jp/yupo…

uint8_t* getBuf() const { return m_buf; } でコンパイルエラーになる

普段ちゃんと const を付けていないので自分でもビックリなところでつまずいてしまった。 #include <stdint.h> class test { public: uint8_t* getBuf() { return m_buf; } private: uint8_t m_buf[256]; }; というソースコードで、getBuf() は副作用がないから const </stdint.h>…

文字列リテラルの配列への代入

gcc で -Wformat-nonliteral の確認をしていたときに、文字列リテラルについてちょっと自分が誤解していたことに気づいた。文字列リテラルの代入は(善し悪しはともかく)次のようなバリエーションがある。 char string0[] = "test"; const char string1[] =…

女医さんの問題

前職の同僚の上司が入院したときに女医さんから「答えが分からない」と相談されたという出所不明の問題です。 12 時間制の時計 1 時間毎に時報が鳴る 時報は時刻の数だけ 1 秒間隔で鳴る 3 時ならピピピと 3 秒鳴る 時刻は好きに合わせて良い こんな時計があ…

root以外のeffective uidの放棄をしてみた

effective uid = root の完全放棄は setuid(newUid) とすれば real uid = effective uid = saved uid = newUid となるので二度と effective uid = root にすることはできなくなる。ところで root ではないが重要なアカウント(仮に 501)があったとして、その…

型の幅以上の左シフトを試してみる

http://journal.mycom.co.jp/articles/2004/04/02/code/古い記事だけど、 この「1」が32bitのint型にキャストされたため「1 というのが気になった。てっきりシフトしすぎて0になるのかと思った。C99 規格を確認してみると整数拡張後の型の幅以上のシフトの結…

整数拡張と算術型変換をコンパイル結果で見てみる

C99 の整数拡張と算術型変換の「見える化」ってできないか〜と思い、何か境界条件などで整数拡張や算術型変換の有無が結果に表れてくる例がないか?と考えたけど思いつかなかった。gcc のコンパイル結果(アセンブリコード)を見ても IA-32 だと、 負の数は2…