Last Update 2021/09/15
-Wshift-overflow=オプション引数(-Wshift-overflow)
左シフトの演算でオーバーフローが発生した際に警告を出力
オプション引数が「2」の場合は、符号ビットに1が左シフトされる際も警告出力
オプション引数が「2」の場合は、符号ビットに1が左シフトされる際も警告出力
テスト概要
オプション無し、および-Wshift-overflowオプションを使用した際の警告出力例
オプション無しで、言語標準C90、C99指定時の警告出力例
オプション引数に1、および2を指定した際の警告出力例
実行環境
GCC-8.2.0
GNU C Library 2.28
GNU Binutils 2.31.1
GNU C Library 2.28
GNU Binutils 2.31.1
コード例・出力内容中の表記
・実行例中の太字表記部分は、コマンドなどの入力された文字列を示します。
・「︙」や「...」の着色省略表記は、 実際のソースコードや出力内容などを省略加工した部分を示します。
・「︙」や「...」の着色省略表記は、 実際のソースコードや出力内容などを省略加工した部分を示します。
使用ファイル
sample.c
#include <stdio.h>
#include <limits.h>
int main(void)
{
printf("INT_MAX : %lx\n\n", INT_MAX);
printf("[A] INT_MAX << 1 : %lx\n", INT_MAX << 1); /* 符号ビットに1を左シフト */
printf("[B] INT_MAX << 2 : %lx\n", INT_MAX << 2); /* オーバーフロー */
printf("[C] (INT_MAX / 2) << 1 : %lx\n", (INT_MAX / 2) << 1);
printf("[D] (INT_MAX / 2) << 2 : %lx\n", (INT_MAX / 2) << 2); /* 符号ビットに1を左シフト */
return 0;
}
オプション無し、および-Wshift-overflowオプションを使用した際の警告出力例
オプション無しで実行
$ gcc sample.c
sample.c: In function ‘main’:
sample.c:9:52: warning: result of ‘2147483647 << 2’ requires 34 bits to represent, but ‘int’ only has 32 bits [-Wshift-overflow=]
printf("[B] INT_MAX << 2 : %lx\n", INT_MAX << 2); /* オーバーフロー */
^~
$ オプション無し(デフォルトで言語標準C17)では-Wshift-overflowが有効
-Wshift-overflowオプションを指定して実行
$ gcc -Wshift-overflow sample.c
sample.c: In function ‘main’:
sample.c:9:52: warning: result of ‘2147483647 << 2’ requires 34 bits to represent, but ‘int’ only has 32 bits [-Wshift-overflow=]
printf("[B] INT_MAX << 2 : %lx\n", INT_MAX << 2); /* オーバーフロー */
^~
$ -Wshift-overflowオプションはデフォルトで有効であるためオプション無しと同じ結果となる
オプション無しで、言語標準C90、C99指定時の警告出力例
言語標準C90を指定して実行
$ gcc -std=c90 sample.c エラー・警告無し
$
言語標準C99を指定して実行
$ gcc -std=c99 sample.c
sample.c: In function ‘main’:
sample.c:9:52: warning: result of ‘2147483647 << 2’ requires 34 bits to represent, but ‘int’ only has 32 bits [-Wshift-overflow=]
printf("[B] INT_MAX << 2 : %lx\n", INT_MAX << 2); /* オーバーフロー */
^~
$ 言語標準C99以降はデフォルトで-Wshift-overflowオプションが有効
オプション引数に1、および2を指定した際の警告出力例
-Wshift-overflow=1を指定して実行
$ gcc -Wshift-overflow=1 sample.c
sample.c: In function ‘main’:
sample.c:9:52: warning: result of ‘2147483647 << 2’ requires 34 bits to represent, but ‘int’ only has 32 bits [-Wshift-overflow=]
printf("[B] INT_MAX << 2 : %lx\n", INT_MAX << 2); /* オーバーフロー */
^~
$ -Wshift-overflow(オプション引数無し)と同じ内容の警告
-Wshift-overflow=2を指定して実行
$ gcc -Wshift-overflow=2 sample.c
sample.c: In function ‘main’:
sample.c:8:52: warning: result of ‘2147483647 << 1’ requires 33 bits to represent, but ‘int’ only has 32 bits [-Wshift-overflow=]
printf("[A] INT_MAX << 1 : %lx\n", INT_MAX << 1); /* 符号ビットに1を左シフト */
^~
sample.c:9:52: warning: result of ‘2147483647 << 2’ requires 34 bits to represent, but ‘int’ only has 32 bits [-Wshift-overflow=]
printf("[B] INT_MAX << 2 : %lx\n", INT_MAX << 2); /* オーバーフロー */
^~
sample.c:11:58: warning: result of ‘1073741823 << 2’ requires 33 bits to represent, but ‘int’ only has 32 bits [-Wshift-overflow=]
printf("[D] (INT_MAX / 2) << 2 : %lx\n", (INT_MAX / 2) << 2); /* 符号ビットに1を左シフト */
^~
$ ./a.out
INT_MAX : 7fffffff
[A] INT_MAX << 1 : fffffffe
[B] INT_MAX << 2 : fffffffc
[C] (INT_MAX / 2) << 1 : 7ffffffe
[D] (INT_MAX / 2) << 2 : fffffffc
$ オーバーフローの他に符号ビットに1が左シフトされる際も警告出力