以前、作成した TeraTerm の背景色をお手軽に変更できるTTXCommandLineOptKai プラグインがTeraTerm 5.x 系の API 変更で動かなくなってしまっていたのでバージョンアップしてみました。
前回と同様、ビルド済みの.dll
は GitHub にアップロードしてあります。
例えば、このプラグインを入れた状態でuser@host.example.com /BG=M
のようなホスト名に対して接続すると、背景は画像のような感じになります。
gcc で練習用のプログラムをコンパイルしていろいろ試していたら、配列の境界外アクセスでも意外と SIGSEGV しないパターンが多いことに気づきました。
test.c
例えば、上記のプログラムを実行するとa[0]
が9
になってしまいます。
初学者だとこういう間違いが非常に多いので、コンパイラの設定でチェックできる方法がないか調べてみたところ、最近の gcc にはAddressSanitizer*1 という仕組みが入っているようです。
仕組みについては USENIX ATC'12 で発表された論文と GitHub のリポジトリがあります。
上記と同じプログラムをサニタイザありでコンパイルして実行すると、こんな感じでruntime error
が出るようになります。
最近の gcc はチェックが厳しくなっているのでscanf()
を使って int の値を char に書込むと*** stack smashing detected ***
というエラーが出るようです。
例えば10 進の値を char に代入するようなプログラムは C 言語の入門などでよく出てきます。
test.c
† コンパイルすると警告が出る
これを単純にコンパイルすると、以下のように警告が出ます。
これを見て驚くのは、最近の gcc はエラーや警告メッセージがかなり丁寧になっているということ。
これをきちんと読めば、scanf()
に含まれる書式指定%d
は可変長引数部分のint *
に対応していなければならないのに対して、実際の可変長引数部分の型はchar *
になっているので、型があっていないというのがきちんと分かります。
これを修正するための候補として%hhd
も挙げられていますね。
† とりあえず無理やり実行してみる
とりあえずコンパイル自身はされているので、警告を無視して実行してみます。
結果は表示されますが、実行時エラーが出て正常終了しません。
実行時のエラーの原因は char (1B) の領域に無理やり int (4B) 分のデータを書込んでしまうからですね。
要はバッファーオーバーフローです。
このバッファオーバーフローが gcc の stack protector*1 によって検知されていることになります。
実行結果が表示されてしまっているのは、stack protector が関数の実行後(今回の場合はmain()
の実行終了時 )にバッファオーバーフローを検出しているためです。
† 書式を修正してみる
gcc の警告のアドバイスに従って書式を%hhd
にしてみるとコンパイルの警告、実行時エラー共に解消しました。
サイズ的には%d
→4B、%hd
→2B、%hhd
→1B となるようなので、h
は half のh
でしょうか(l
はlongのl
だと分かるのですが)。test.c
ちなみに調べてみたらh
接頭辞は C99 から使えるようになっていたようです。
C で cwd を表示するプログラムが書きたくなって調べてみたのでメモ。
やり方はいろいろあるようなのですが、Linux / Windows 両対応させたいので POSIX に含まれているgetcwd()*1 を使ってみました。
C はアプリを書くために普段あまり使っていないので、やっぱりちょっと面倒な感じがしますね。
プログラミング言語の人気ランキングとしてよく使われているTIOBE Index でPython が始めて 2 位になっていました。
C と Java が 1, 2 位を明け渡すのは TIOBE Index 至上初とのこと。
Java は Oracle の JRE/JDK ライセンス変更以降、退潮傾向が続いているので中長期的にはしょうがないかなという感じもします。
JavaとCの2大人気に異変、Pythonが2位にーーTIOBE Index | OSDN Magazine
オランダTIOBE Softwareが発表した最新のプログラミング言語ランキング「TIOBE Index for November 2020」で、Pythonが過去最高位の2位となった。約20年前にTIOBE Indexの作成を開始以来初めてJavaとCが揃って上位2位に入らないという結果となった。