warning: unsigned conversion from ‘int’ to ‘unsigned char’ changes value from ‘305419896’ to ‘120’
警告: ‘int’ から ‘uint8_t’ への符号なし変換 {別名 ‘unsigned char’ } は、値を ‘305419896’ から ‘120’ に変更します
[-Woverflow]
■オーバーフロー(overFlow)とは?
オーバーフロー(overFlow)/
➡桁あふれ系/
├ ➡➡ 整数オーバーフロー(Integer overflow)/
│
➡メモリ破壊系/
├➡➡バッファオーバーフロー(buffer overflow)/
└➡➡バッファオーバーラン(buffer overrun)/
※buffer overflowとbuffer overrunは同じバグです。
■桁あふれの例
#include <stdio.h>
int main(void){
unsigned char x ;
x = 0x12345678 ;
printf("桁あふれ %x->%x\n",0x12345678,x);
}
桁あふれ
計算結果が数値の表現範囲を超えること。
xの上限は0xFFまでで
0x12345678は桁あふれして上位が欠損します。
参考:
■メモリ破壊の例
#include <stdio.h>
#include <stdint.h>
int main(void){
uint8_t x = 0xAB;
printf("領域破壊前 %X\n",x);
fflush(stdout);
*(uint32_t *)&x = 0x12345678 ;
printf("領域破壊後 %X\n",x);
fflush(stdout);
}
データが格納領域の範囲を超えること
1byteしかないxの領域をキャストして
コンパイラを騙し
4byte書き込むのでメモリ破壊が発生します。
■オーバーフローとメモリリークは全然別のバグ
#include <stdio.h>
#include <string.h>
int main(void){
char buf[6];
strcpy(buf,"jugemu");
puts(buf);
sprintf(buf,"%s","jugemu");
puts(buf);
}
「strcpy メモリリーク」で検索すると上記のようなコードが結構ヒットするけれど、
メモリリークはメモリ解放漏れのバグで
オーバーフローとは全然別のバグです。