Cè¨èªï¼C++ãå«ãï¼ãç¿å¾ããã人ï¼ãã¤ã³ã¿ãåå¼·ããã人ã¯gcc-14ã使ãã¾ãããï¼é£ããã¨ãã㯠gcc-14 ãä¸å¯§ã«è§£èª¬ãã¦ããã¾ã
Cè¨èªã®é£ããã¨ãã
ä¾ã示ãã¾ãï¼Cè¨èªã§è¨è¿°ãããï¼ãã£ãï¼è¡ã®ã½ã¼ã¹ã³ã¼ãã§ã
int main() { int buf[10]; buf[10] = 0; return 0; }
ãã®ã½ã¼ã¹ã³ã¼ãã«ã¯åé¡ãããã¾ãï¼åè¦ã§ãããã§ããããï¼
:
:
:
åé¡ãããã®ã¯ buf[10]=0 ã®é¨åã§ãï¼Cè¨èªã§ãããã¡ãªãã¹ã§ããï¼ããããã°ãã»ãã¥ãªãã£ãã¼ã«ã®åå ã«ãªãã¾ãï¼
Cè¨èªãé£ããçç±ã¯äºã¤ããã¾ãï¼ãã®æã®åé¡ãè¦éããããç¹ã¨ï¼ãã®æã®åé¡ãç解ãããã¨ãé£ããç¹ã®äºã¤ã§ã
gcc 14 ã«è§£èª¬ãã¦ãããã¾ããã
ä¸è¨ã®ï¼è¡ã®ã½ã¼ã¹ã³ã¼ããgcc14ã使ã£ã¦ã³ã³ãã¤ã«ãã¦ã¿ã¾ã
ã½ã¼ã¹ã³ã¼ãã®ãã¡ã¤ã«å㯠test.c ã¨ãã¾ã
$ gcc-14 -fanalyzer src.c
ãã¤ã³ãã¯
- gccã¯ãã¼ã¸ã§ã³14ã使ã
- ãªãã·ã§ã³ã§ -fanalyzer ãæå®ãã
ã®äºã¤ã§ã
çµæã¯ãããªãã¾ãï¼ã¢ã¹ãã¼ã¢ã¼ããªã®ã§ç»åãã³ãããã¦ãã¾ãï¼

gccãå ¨åã§åé¡ç¹ã解説ãã¦ããã¾ãï¼
ã¾ãåé ï¼ç´«è²ã®æåã§ã buf[10]=0 ãã«åé¡ããããã¨ãææãã¦ãã¾ã
次ã«ï¼æ«å°¾ã®å³ä¸ï¼ã¢ã¹ãã¼ã¢ã¼ãã®èµ¤æ ã®é¨åã§ãoverflow of 4 bytesãã¨è¡¨ç¤ºããã¦ãã¾ãï¼ããã§4ãã¤ãã®ã¡ã¢ãªãªã¼ãã¼ããã¼ãèµ·ãã¦ãããã¨ãå³ç¤ºãã¦ãã¾ã
ã¢ã¹ãã¼ã¢ã¼ãã®ç©å½¢ï¼é·æ¹å½¢ã®é¨åï¼ã¯ï¼ã¡ã¢ãªãæå³ãã¦ãã¾ãï¼
ç©å½¢ã®è²ã«ãæå³ãããã¾ã
- ç·ã®ç©å½¢ã確ä¿ããã¡ã¢ãªé å
- 赤ã®ç©å½¢ã¯ç¢ºä¿ãã¦ããªãã¡ã¢ãªé å
ã§ãï¼
buf[10]=0 ã¯ï¼èµ¤ã®é åã¸ã®æ¸ãè¾¼ã¿ï¼ã¤ã¾ãã¡ã¢ãªã確ä¿ãã¦ããªãé åã¸ã®æ¸ãè¾¼ã¿ã§ãããã¨ãä¸ç®ã§ãããã¾ãï¼
æ°´è²ã®é¨åã¯ã½ã¼ã¹ã³ã¼ãã¨æç« ã§ï¼ã¢ã¹ãã¼ã¢ã¼ãã®å 容ã説æãã¦ãã¾ãï¼
ãã®ããã«gcc 14ã使ãã¨ï¼åé¡ãããå ´åã¯ãã®çç±ãã¢ã¹ãã¼ã¢ã¼ãã§è§£èª¬ãã¦ãããããã«ãªãã¾ãã
ããã§ã¡ã¢ãªããã¤ã³ã¿ãé¢ä¿ããé£ãããã°ã»ä¸å ·åãï¼ä¸ç®ã§ç°¡åã«ç解ã§ããããã«ãªãã¾ãï¼å¤ãã®å ´åã¯ï¼ã¾ã赤ãé åã¨ç·ã®é åã確èªãã¦ï¼ããããæ°´è²ã®é¨åãèªãã°ï¼ã½ã¼ã¹ã³ã¼ãã®ã©ããä¿®æ£ããã°è¯ãããå¤ã訳ã§ãï¼
ã¾ã¨ã
- gcc 14 ã使ãã¾ããã
- ãªãã·ã§ã³ -fanalyzer ãæå®ãã¾ããã
- ã½ã¼ã¹ã³ã¼ãä¸ã®åé¡ã gcc ãä¸å¯§ã«è§£èª¬ãã¦ããã¾ã