年末 (4)
2024/12/29
はじめに
年末なので C言語で昔作ったプログラムの改修をすることにした。
来年になったら勉強を兼ねて一から作り直したいと思うが、その気力があるかどうかわからん。
コードを公開しないので、作業中に出てきた問題や理解していなかったことをメモがてら記録していく。
全然まとまりはない。
バイトオーダーの扱い
エンディアンとかバイトオーダーとかの扱いはどうなっているだろうか。
gcc では __BYTE_ORDER__
で取得でき、__ORDER_LITTLE_ENDIAN__
などと比較してチェックできる。
私のお仕事ではリトルエンディアン以外の CPU を使ったことはほとんど記憶にない。
なのでリトルエンディアン前提で書いてしまいたいのだが吸収する機能があるならそれを使いたい。
socket を使っていると htons()
のような関数がある。
悪くないのだが include するのが <arpa/inet.h>
なのであまり使いたくない。
htons()
たちは libc だったので、libc に絞って探すと何かあるかも、と期待したらあった。
uint8_t
の配列ではなく同じ型の変数として返すようだ。
同じ型の変数を使うのでプロトコルデータに直接代入したり、データから直接変換したりはできないか。
バイトオーダーを反転させる関数もあった。
ARM版らしきヘッダファイルがあったが、素直な実装だ。
i386 でアセンブラを使っていたコードも見かけたのでアラインメントを整えておくとそういう最適化もできるということか。
アラインメントというか、関数呼び出しすることでレジスタに値が入るということに意味があるのか。
そういえば、エンディアンを変換するコードを普通に書いたらアセンブラだと専用命令を使っていたという記事を書いた記憶が。。。
すっかり忘れていた。
なので <endian.h>
の関数を使っても自分でマクロを書いてもうまいこと最適化してくれそうだ。
ただバイトデータの途中だと専用命令は使えないだろうから、一度変数に代入する方が効果が高そうだ。
これを使って実装し、テストコードを書いていたのだが GitHub Copilot のアシストが便利だった。
Little Endian の 16bit テストを書いたら、それっぽく 32bit, 64bit のコードも作ってくれた(多少違っていたが)。
そして Big Endian のテスト関数も書かねばと名前を書いたら中身もそれっぽく Big Endian 用に作った関数で埋めてくれた(多少違っていたが)。
私の思考が単純だったからか、Copilot のアシストが優秀なのか。
どっちもだな。
似たコード
テストコードを書いていると急に Copilot が通知してきた。
[info] file:///home/ほにゃほにゃ.c Similar code with 2 license types [BSD-2-Clause, unknown] https://github.com/github-copilot/code_referencing?cursor=3137<...中略...>bed79,662b1<...中略...>dbd016&editor=vscode [Ln 12345, Col 0] ほにゃにゃにゃ...
見に行くと、連番で作った private key とその public key のテストデータが使われていた。
まあ、確かに似たようなコードだ。
そして private key のときは何も言わず public key のデータを書いたときに指摘したので、
単なる連番はスルーしたけど不規則なデータだったから指摘したということだろうか。
いやー、個人のプログラムだったからよいけどお仕事のコードだったらあせるね。
それに「見てません!」と言われても本当なのかどうなのか確認する手段がないですな。
Copilot の Extension を無効にするだけで良いのか、そもそも普段はどうなのかなど、いろいろ気になってくる。
仕事用にネットワークをほとんど使わない IDE 型のテキストエディタを探しておくべきかもしれない。