clang で初期化されていない変数を使った場合に警告を出すには、-Wuninitialized
オプションを指定します。
// Program 1
#include <stdio.h>
int main(void)
{
int x;
printf("%d\n", x);
return 0;
}
このプログラムを起動すると、環境によって実行ごとに異なる値が表示されます(同じ値が表示されることもあります)。
$ # Intel Mac + macOS Big Sur (11.2) + Apple clang 12.0.0
$ clang program1.cpp -o program1
$ ./program1
318947794
$ ./program1
208458194
コンピュータのメモリは有限のため、同じ領域を何度か繰り返して使う必要があります。
他のプログラムが値を書き込んだメモリを再利用する際には初期化をする必要がありますが、C++ では初期化が不要な場合(後々あらためて初期化されることが分かっているため、初期化を省略できる場合など)に動作を高速化できるよう、初期化は明示的に行うことになっています。
たとえば、次のプログラムは問題なく動作します。
// Program 2
#include <stdio.h>
int main(void)
{
int x;
x = 123;
printf("%d\n", x);
return 0;
}
$ # Intel Mac + macOS Big Sur (11.2) + Apple clang 12.0.0
$ clang program2.cpp -o program2
$ ./program2
123
$ ./program2
123
実際には不注意のため、Program 2 のように書くつもりで Program 1 のように書いてしまう場合があります。 このため、clang や gcc などの C++ コンパイラではコンピュータによる警告を表示することができます。
$ # Intel Mac + macOS Big Sur (11.2) + Apple clang 12.0.0
$ clang program1.cpp -o program1 -Wuninitialized
program1.cpp:7:20: warning: variable 'x' is uninitialized when used here [-Wuninitialized]
printf("%d\n", x);
^
program1.cpp:6:10: note: initialize the variable 'x' to silence this warning
int x;
^
= 0
1 warning generated.
Program 2 では x
は正しく初期化されているため、警告は表示されません。
$ # Intel Mac + macOS Big Sur (11.2) + Apple clang 12.0.0
$ clang program2.cpp -o program2 -Wuninitialized
警告を抑制する
逆に、警告を抑制したい場合は -Wno-uninitialized
オプションを指定します。 このオプションを指定することで、既に指定されたオプションを打ち消すことができます。
$ # Intel Mac + macOS Big Sur (11.2) + Apple clang 12.0.0
$ clang program1.cpp -o program1 -Wuninitialized -Wno-uninitialized
参考資料
- Clang 12 documentation — DIAGNOSTIC FLAGS IN CLANG
https://clang.llvm.org/docs/DiagnosticsReference.html#wuninitialized