整数の変換
C/C++セキュアコーディングを読んでのメモ
char型の変数に数値を代入し, その範囲を越える量の値が変数に入るようにプログラムを書くと, char型はint型に格上げされるらしい.
ちょっとプログラムを書いてテスト.
#include<stdio.h> #include<limits.h> int main( int argc, char *argv[] ) { char c1 = CHAR_MAX; char c2 = CHAR_MIN; char c3 = 1; printf( "CHAR_MAX : %4d\n", CHAR_MAX ); printf( "CHAR_MIN : %4d\n", CHAR_MIN ); printf( "c1 : %4d\n", c1 ); printf( "c2 : %4d\n", c2 ); printf( "c3 : %4d\n", c3 ); printf( "c1 + c3 : %4d\n", c1 + c3 ); printf( "c2 - c3 : %4d\n", c2 - c3 ); return 0; }
これをコンパイルしてみると, 何のエラーもなく通る.
実行結果がこれ↓.
[khiker@khlin001 ~/<1>c/secure]$ gcc -Wall test_over.c -o test_over [khiker@khlin001 ~/<1>c/secure]$ ./test_over CHAR_MAX : 127 CHAR_MIN : -128 c1 : 127 c2 : -128 c3 : 1 c1 + c3 : 128 c2 - c3 : -129
確かにcharの範囲を越えているのにちゃんと代入でき, 表示できている.
変数の型が何か分かるような関数か何かがあったら, c1 + c3 や c2 - c3 の型が char から int に格上げされたかを確認できるのに.
無いのかな?