- blogs:
- cles::blog
TeraTerm の背景色をお手軽に変更できる TTXCommandLineOptKai を TeraTerm5 対応に
以前、作成した TeraTerm の背景色をお手軽に変更できる TTXCommandLineOptKai プラグインが TeraTerm 5.x 系の API 変更で動かなくなってしまっていたのでバージョンアップしてみました。
前回と同様、ビルド済みの .dll
は GitHub にアップロードしてあります。
例えば、このプラグインを入れた状態で user@host.example.com /BG=M
のようなホスト名に対して接続すると、背景は画像のような感じになります。
gcc で配列の境界外アクセスをチェックする
gcc で練習用のプログラムをコンパイルしていろいろ試していたら、配列の境界外アクセスでも意外と SIGSEGV しないパターンが多いことに気づきました。
test.c
例えば、上記のプログラムを実行すると a[0]
が 9
になってしまいます。
初学者だとこういう間違いが非常に多いので、コンパイラの設定でチェックできる方法がないか調べてみたところ、最近の gcc には AddressSanitizer*1 という仕組みが入っているようです。
仕組みについては USENIX ATC'12 で発表された論文と GitHub のリポジトリがあります。
- Konstantin Serebryany, Derek Bruening, Alexander Potapenko, Dmitry Vyukov, "AddressSanitizer: A Fast Address Sanity Checker," Proceedings of the 2012 USENIX conference on Annual Technical Conference (USENIX ATC'12), Jun.2012.
- AddressSanitizer · google/sanitizers Wiki · GitHub
上記と同じプログラムをサニタイザありでコンパイルして実行すると、こんな感じで runtime error
が出るようになります。
scanf() で整数を 1 バイト分だけ読み取る
最近の 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 を取得する
C で cwd を表示するプログラムが書きたくなって調べてみたのでメモ。
やり方はいろいろあるようなのですが、Linux / Windows 両対応させたいので POSIX に含まれている getcwd()*1 を使ってみました。
C はアプリを書くために普段あまり使っていないので、やっぱりちょっと面倒な感じがしますね。
TIOBE Index で Python が初の 2 位に
プログラミング言語の人気ランキングとしてよく使われている 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位に入らないという結果となった。
- 越生で見つけた丸形ポストの大群 (1)
2 . 福岡銀がデマの投稿者への刑事告訴を検討中(100841)
3 . 年次の人間ドックへ(100718)
4 . 三菱鉛筆がラミーを買収(100313)
5 . 2023 年分の確定申告完了!(1つめ)(100277)
Academic[574]
Book[155]
Diary[522]
Disaster[101]
Foodlogue[1425]
Game[284]
Goods[805]
Healthcare[341]
Hobby[32]
IT[1195]
Military[343]
misc.[1570]
Mobile[510]
Music[38]
Neta[106]
News[95]
Photo[391]
RealEstate[120]
Security[1178]
SEO Contest[36]
Software[634]
Tips[1886]
Travelogue[1238]
Web[675]
Work[193]