あまり決めごとを厳しくしない私の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 件のコメント:
コメントを投稿
コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。
注: コメントを投稿できるのは、このブログのメンバーだけです。