【C言語】
整数オーバーフローと
バッファオーバーフローの違い

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は桁あふれして上位が欠損します。

参考:

comp.lang.c FAQ list · Question 3.14


■メモリ破壊の例

#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 メモリリーク」で検索すると上記のようなコードが結構ヒットするけれど、
メモリリークはメモリ解放漏れのバグで
オーバーフローとは全然別のバグです。