clang でシフト演算のビット数超過を警告するには、-Wshift-count-overflow
オプションを指定します。
#include <stdio.h>
int main()
{
int x = 8;
int y = x << 33;
printf("%d\n", y);
return 0;
}
シフト幅が左辺の整数型のビット数を超えた場合の動作は未定義です。 したがって、意図しない演算結果となることがあります。
$ # M1 Mac (Ventura) + Apple clang 14.0.0
$ clang sample.cpp -o sample -Wshift-count-overflow
sample.cpp:6:15: warning: shift count >= width of type [-Wshift-count-overflow]
int y = x << 33;
^ ~~
1 warning generated.
$ ./sample
16
-Wshift-count-overflow
は デフォルトで有効になっている ため、警告は自動的に表示されます。
$ # M1 Mac (Ventura) + Apple clang 14.0.0
$ clang sample.cpp
sample.cpp:6:15: warning: shift count >= width of type [-Wshift-count-overflow]
int y = x << 33;
^ ~~
1 warning generated.
警告を抑制する
逆に、警告を抑制したい場合は -Wno-shift-count-overflow
を指定します。
$ # M1 Mac (Ventura) + Apple clang 14.0.0
$ clang sample.cpp -Wno-shift-count-overflow
$
参考資料
-
Clang documentation — DIAGNOSTIC FLAGS IN CLANG
https://clang.llvm.org/docs/DiagnosticsReference.html#wshift-count-overflow -
INT34-C. 負のビット数のシフトやオペランドのビット数以上のシフトを行わない
https://www.jpcert.or.jp/sc-rules/c-int34-c.html