[M1 Mac, Big Sur 11.6.8, clang 13.0.0, NO IDE]
引き続き、バッファオーバーフロー対策であるclang++の-fstack-protector-allオプションについて実用性を検証しました。
前回得られたデータから、char変数を増やしていくとやがてint変数のメモリ領域を上書きしてしまうと予想しましたが、実際にそうなるのか検証しました。
変数i予想値の算出方法:
2進数 1101000 00000000 00000000 00000000
反転 0010111 11111111 11111111 11111111
1加算 0011000 00000000 00000000 00000000
10進数 -402653184
その結果、char変数の数に関係なく、int変数との間に複数の空アドレスが配置されることが判明しました。
さすがに文法さえ正しければコードは正常に動くようです。
scanf関数の検証は今度こそこれで終わりにします。
#include <cppstd.h>
int main() {
int i;
char c[2];
char c2[2];
char c3[2];
char c4[2];
char c5[2];
char c6[2];
for (i=0; i< 10; i++){
printf("for文先頭直後 printf i: %d\n",i);
// rewind(stdin); // ストリームバッファをクリア
scanf("%s", &c);
cout << "cout c: " << c << endl;
printf("printf c: %s\n",&c);
scanf("%s", &c2);
cout << "cout c2: " << c2 << endl;
printf("printf c2: %s\n",&c2);
scanf("%s", &c3);
cout << "cout c3: " << c3 << endl;
printf("printf c3: %s\n",&c3);
scanf("%s", &c4);
cout << "cout c4: " << c4 << endl;
printf("printf c4: %s\n",&c4);
scanf("%s", &c5);
cout << "cout c5: " << c5 << endl;
printf("printf c5: %s\n",&c5);
scanf("%s", &c6);
cout << "cout c6: " << c6 << endl;
printf("printf c6: %s\n",&c6);
printf("printf i: %d\n",i);
cout << "for文終端" << endl;
}
return 0;
}
--------------------------------------------------
出力
--------------------------------------------------
for文先頭直後 printf i: 0
a
cout c: a
printf c: a
b
cout c2: b
printf c2: b
c
cout c3: c
printf c3: c
d
cout c4: d
printf c4: d
e
cout c5: e
printf c5: e
f
cout c6: f
printf c6: f
printf i: 0
for文終端
for文先頭直後 printf i: 1