page0006
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
開始行:
* OSECPUでのポインタの扱い
-(by [[K]], 2013.03.12)
** テーマ1
int *a = malloc(1234);
free(a);
a[123] = 123;
-このプログラムは明らかにまずい、free()したあとのメモリに...
----
-ポインタレジスタを128itにする。そのうちの32bitは普通のポ...
--void *p; // ポインタ本体
--PTRHND *phnd; // ポインタハンドル
--int sign; // シグネチャ
--int dummy; // リザーブ
-ポインタハンドルを参照すれば、このポインタpの参照先のメ...
-ポインタを初期化する時に、ポインタハンドルからシグネチャ...
-そしてポインタを使ってアクセスする時は、ポインタハンドル...
-freeした場合、ポインタハンドルの先のシグネチャは乱数で上...
--乱数がたまたま一致してしまった!という場合は突破できて...
** テーマ2
-[テーマ1]で「バグ検出エラー」が出るのは非常にうれしいけ...
-それはfree時にポインタハンドルに情報を書き残しておけばよ...
-でもポインタハンドルを別のオブジェクトの管理のために再利...
-ということで、malloc()時にポインタハンドルを再利用しない...
--なおプログラムが高速危険モードで実行されている時は、こ...
--そもそも高速危険モードの場合は、いくつかのバグ検出機能...
** テーマ3
-[テーマ1]や[テーマ2]で、不適切なfree()は多分容易に発見で...
--要するにメモリリークですね。
-これはプログラムの実行中の好きなタイミングで、ポインタハ...
--ポインタハンドルにはいろんな情報がつまっています。mallo...
-これで「あれ?このオブジェクトがどうしてまだ居座っている...
--ループする度にリークしているのが分かったりしたらいいで...
** テーマ5
-OSECPUのデータポインタにできること、できないこと。まとめ。
--仕様を詰めたのでやっと断言できるようになりました。
-(1) unionは使えません(そういう構文がない)。
-(2) 互換性のあるポインタへのキャストはできます。
-(3) int a[3]; で宣言されているのなら、a[3]へはアクセスで...
-(4) 2つのポインタを大小比較することができますが、これは...
-(5) 大きな配列から部分配列を作ることができます(これは配...
-(6) 型を間違えたらエラーです。
-(7) OSECPUのCPUはPxxについて、型情報やアクセス可能域に関...
-(8) ADDPTR命令でポインタのシークができますが、この時アク...
--つまり実際にメモリアクセスを発生させなくてもエラーが出...
--この仕様はやめました(by K, 2013.07.08)。PADDだけでは...
-(9) SUBPTR命令で二つのポインタの引き算ができますが、これ...
-(10) メモリ上の値の符号の有無やエンディアンについては、J...
-(11) たとえば signed char のメモリに対して128を書き込も...
--このエラーを検出できない可能性もあります・・・すみませ...
-(12) [テーマ1]のようにfree()したメモリ域を指しているポイ...
-(13) realloc()ではメモリ域を縮小する場合であっても、ポイ...
--これは同じ領域を指している他のポインタを確実に無効化す...
-(14) malloc()でint4個分の領域を取ったのなら、やはりそこ...
-(15) int a[4][4]; のような配列があったとして、これを int...
--これをどうしてもやりたいときはint b[16];で領域を確保し...
-(16) データポインタにJMPすることはできません。しかしOSを...
--これを使えば言語処理系みたいなものも作れますね!
--C言語ではこれが標準の範囲ではできません。プログラム内で...
-(17) ある命令に対して、エラーを起こすかどうかをチェック...
--この手のポインタのエラーは、普通のプログラムのやり方で...
** テーマ6
-システムコールから戻る時にレジスタを放置して大事なポイン...
-システムコールから帰るときはやばいポインタが残っていない...
** こめんと欄
-このページにこめんと欄はありません。このページの内容にコ...
終了行:
* OSECPUでのポインタの扱い
-(by [[K]], 2013.03.12)
** テーマ1
int *a = malloc(1234);
free(a);
a[123] = 123;
-このプログラムは明らかにまずい、free()したあとのメモリに...
----
-ポインタレジスタを128itにする。そのうちの32bitは普通のポ...
--void *p; // ポインタ本体
--PTRHND *phnd; // ポインタハンドル
--int sign; // シグネチャ
--int dummy; // リザーブ
-ポインタハンドルを参照すれば、このポインタpの参照先のメ...
-ポインタを初期化する時に、ポインタハンドルからシグネチャ...
-そしてポインタを使ってアクセスする時は、ポインタハンドル...
-freeした場合、ポインタハンドルの先のシグネチャは乱数で上...
--乱数がたまたま一致してしまった!という場合は突破できて...
** テーマ2
-[テーマ1]で「バグ検出エラー」が出るのは非常にうれしいけ...
-それはfree時にポインタハンドルに情報を書き残しておけばよ...
-でもポインタハンドルを別のオブジェクトの管理のために再利...
-ということで、malloc()時にポインタハンドルを再利用しない...
--なおプログラムが高速危険モードで実行されている時は、こ...
--そもそも高速危険モードの場合は、いくつかのバグ検出機能...
** テーマ3
-[テーマ1]や[テーマ2]で、不適切なfree()は多分容易に発見で...
--要するにメモリリークですね。
-これはプログラムの実行中の好きなタイミングで、ポインタハ...
--ポインタハンドルにはいろんな情報がつまっています。mallo...
-これで「あれ?このオブジェクトがどうしてまだ居座っている...
--ループする度にリークしているのが分かったりしたらいいで...
** テーマ5
-OSECPUのデータポインタにできること、できないこと。まとめ。
--仕様を詰めたのでやっと断言できるようになりました。
-(1) unionは使えません(そういう構文がない)。
-(2) 互換性のあるポインタへのキャストはできます。
-(3) int a[3]; で宣言されているのなら、a[3]へはアクセスで...
-(4) 2つのポインタを大小比較することができますが、これは...
-(5) 大きな配列から部分配列を作ることができます(これは配...
-(6) 型を間違えたらエラーです。
-(7) OSECPUのCPUはPxxについて、型情報やアクセス可能域に関...
-(8) ADDPTR命令でポインタのシークができますが、この時アク...
--つまり実際にメモリアクセスを発生させなくてもエラーが出...
--この仕様はやめました(by K, 2013.07.08)。PADDだけでは...
-(9) SUBPTR命令で二つのポインタの引き算ができますが、これ...
-(10) メモリ上の値の符号の有無やエンディアンについては、J...
-(11) たとえば signed char のメモリに対して128を書き込も...
--このエラーを検出できない可能性もあります・・・すみませ...
-(12) [テーマ1]のようにfree()したメモリ域を指しているポイ...
-(13) realloc()ではメモリ域を縮小する場合であっても、ポイ...
--これは同じ領域を指している他のポインタを確実に無効化す...
-(14) malloc()でint4個分の領域を取ったのなら、やはりそこ...
-(15) int a[4][4]; のような配列があったとして、これを int...
--これをどうしてもやりたいときはint b[16];で領域を確保し...
-(16) データポインタにJMPすることはできません。しかしOSを...
--これを使えば言語処理系みたいなものも作れますね!
--C言語ではこれが標準の範囲ではできません。プログラム内で...
-(17) ある命令に対して、エラーを起こすかどうかをチェック...
--この手のポインタのエラーは、普通のプログラムのやり方で...
** テーマ6
-システムコールから戻る時にレジスタを放置して大事なポイン...
-システムコールから帰るときはやばいポインタが残っていない...
** こめんと欄
-このページにこめんと欄はありません。このページの内容にコ...
ページ名: