2016/09/06

[c/c++]私のC言語 (11) - intptr_tとuintptr_t

あまり決めごとを厳しくしない私のC言語ではあるが、それでもときどき考え込むし、安全のためにはこれでいいんだっけ?と悩むこともある。

それに、安全といっても、どこででも通用するものと、その現場でしか通用しないものがあろう。
せめて、どこででも通用するルールについては把握しておき、そのルールを使うかどうかは別として、使わなかったらどうなるということは知っておきたい。

それを自分で考えるとあやしいので、IPAがせっかくリリースしている資料があるので、使うことにする。

【改訂版】組込みソフトウェア開発向け コーディング作法ガイド[C言語版]Ver.2.0

今見たところでは、2016年4月13日更新になっている。
買うこともできるのだが、PDF版はダウンロードできるのだ。


まだ最初の方を読み始めたばかりなのだが、「信頼性2.7 ポインタの型に気を付ける」(p.49)で立ち止まった。

stdint.hには、intptr_tとuintptr_tという型があり、ポインタ型を格納可能なデータ幅の整数型だとのこと。

ときどきOSで、割り込みハンドラの引数がint型で、そこに渡す数値は自由にできる、というタイプがある。
ポインタを渡したくてもint型なので、intにキャストして、呼ばれた先で戻すのだ。
Windowsだと、LPARAMとかだった気がする。

そういう場合に、こういう型を使うとよい、ということなんだろう。
まあ、提供されたOSだと自分で決められはしないのだが。。。

 

逆のパターンで、引数がvoidポインタ型という方が多いかもしれない。
こちらだと、整数型の変数を用意してアドレスを渡せばよいから、まっとうだろう。

ただ・・・そのためだけにヒープ領域を使うのも心苦しい。
malloc()が使えるなら、渡した後でfree()すればよいかもしれないが、私の環境ではヒープ領域を削ることも多いのだ。
そこで、ポインタ型でアドレスを保存できるサイズなら32bit程度の値は入るということで、整数値をvoidポインタでキャストして、呼ばれた先でまた整数に戻す、ということをしばしば行う。

行儀は悪いと思うのだけど、かといって変数を用意するほどでもないし。。。
じゃあ変数を用意して使い回すかというと、それは危険だから別々に用意したいし。。。
もやもやしつつも、抜け出せていない。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。