- blogs:
- cles::blog
2022/10/06

gcc で配列の境界外アクセスをチェックする


gcc で練習用のプログラムをコンパイルしていろいろ試していたら、配列の境界外アクセスでも意外と SIGSEGV しないパターンが多いことに気づきました。
test.c
#include <stdio.h>
int main(void){
int a[10] = {1,2,3};
int b[2] = {4,5};
printf("a[0] %p\n", &a[0]);
printf("b[2] %p\n", &b[2]);
b[2] = 9; // a[0] アドレスと同じなので、a[0]への代入になる
for(int i = 0; i < 3; i++){
printf("a[%d] = %d\n",i,a[i]);
}
}
例えば、上記のプログラムを実行すると a[0]
が 9
になってしまいます。
$ gcc test.c
$ ./a.out
a[0] 0x7fffd1363e80
b[2] 0x7fffd1363e80
a[0] = 9
a[1] = 2
a[2] = 3
初学者だとこういう間違いが非常に多いので、コンパイラの設定でチェックできる方法がないか調べてみたところ、最近の 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
が出るようになります。
$ gcc -g -fsanitize=bounds test.c
$ ./a.out
a[0] 0x7ffdff286da0
b[2] 0x7ffdff286da0
test.c:9:3: runtime error: index 2 out of bounds for type 'int [2]'
a[0] = 9
a[1] = 2
a[2] = 3
トラックバックについて
Trackback URL:
お気軽にどうぞ。トラックバック前にポリシーをお読みください。[policy]
このエントリへのTrackbackにはこのURLが必要です→https://blog.cles.jp/item/13528
Trackbacks
このエントリにトラックバックはありません
Comments
愛のあるツッコミをお気軽にどうぞ。[policy]
古いエントリについてはコメント制御しているため、即時に反映されないことがあります。
古いエントリについてはコメント制御しているため、即時に反映されないことがあります。
コメントはありません
Comments Form
コメントは承認後の表示となります。
OpenIDでログインすると、即時に公開されます。
OpenID を使ってログインすることができます。
サイト内検索
検索ワードランキング
へぇが多いエントリ
- メイリオ + Consolas の等幅... (1)
- シェルスクリプトで最新のフ... (1)
- 情報処理安全確保支援士の登... (1)
- どうしてみんな firewalld で... (1)
- Windows のディスクのプロパ... (1)
閲覧数が多いエントリ
1 . Thunderbird のメッセージをスレッド化しないようにする(7285)
2 . Word で数式がグレーアウトされていて挿入できないときは(7116)
3 . Windows 10 で勝手にログアウトされないようにする(5354)
4 . Firefox でパスワードが保存されるページとされないページの違い(4035)
5 . awk で指定した n カラム目以降を出力する(3615)
2 . Word で数式がグレーアウトされていて挿入できないときは(7116)
3 . Windows 10 で勝手にログアウトされないようにする(5354)
4 . Firefox でパスワードが保存されるページとされないページの違い(4035)
5 . awk で指定した n カラム目以降を出力する(3615)
cles::blogについて
Referrers