JUCE開発のおすすめ警告オプション
オーディオアプリケーションやプラグインはリアルタイム性が強く求められるので、実行時デバッグには困難がつきまとう。
全ての不具合をコンパイル時に見つけるのは難しいが、コンパイル時に見つけられる簡単なバグもある。
単体テストや静的解析などを用いることも重要だが、まずはコンパイラの警告オプションを適切に設定するべきである。
この記事ではProjucerの設定を通して、C++の警告オプションについて簡単に触れる。
環境
macOS 10.15.7
JUCE v6.0.5
Xcode 12.2
ProjucerでXcode用のExporterを扱う場合を前提とします。
Projucerのおすすめ警告オプション
ProjucerのXcode用ExporterではProjucerおすすめの警告オプションを追加するための項目 Add Recommended Compiler Warning Flagsがあります。
まずはこれをEnabledに変更します。
https://gyazo.com/74fcc035854f3d24ff9fdbb0ca2d6085
するとこれらの警告オプションが追加されます。
code: Add Recommended Compiler Warning Flags for Xcode
-Wall -Wshadow-all -Wshorten-64-to-32 -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wconversion -Wsign-compare -Wint-conversion -Wconditional-uninitialized -Woverloaded-virtual -Wreorder -Wconstant-conversion -Wsign-conversion -Wunused-private-field -Wbool-conversion -Wextra-semi -Wunreachable-code -Wzero-as-null-pointer-constant -Wcast-align -Winconsistent-missing-destructor-override -Wshift-sign-overflow -Wnullable-to-nonnull-conversion -Wno-missing-field-initializers -Wno-ignored-qualifiers -Wswitch-enum
警告オプションをさらに追加する
Extra Compiler Flagsではさらに任意の警告オプションを追加できます。私はこれらを追加しています。
code: Extra Compiler Flags for Xcode
-Wno-sign-conversion
-Wno-sign-compare
-Wfloat-conversion
https://gyazo.com/7e3109cea165cba8e8f679ae4327d3b4
-Wno-sign-conversion, -Wno-sign-compare
Add Recommended Compiler Warning Flagsで設定された警告オプションでは、配列インデックスにint変数を指定した時のunsigned long <-> intの暗黙の変換まで警告されてしまいます。
それではあまりに多くの警告が出てしまうので、それは警告しないことにしました。
-Wfloat-conversion
double → floatのダウンキャストを警告します(明示的にした場合は大丈夫)。
おまけ
ふだんは追加していないけれど、検討する価値のあるもの。
-Wdouble-promotion
float → doubleの暗黙キャストを警告します。
単精度浮動小数点演算用でコード書いてるのに不意にdoubleに変換されて計算資源を無駄にしないために。
マイコン用のコード書くときは必ず有効にしている。gccでも使えます。
JUCE自体のコードにも警告出ちゃうので使ってない。
-Wold-style-cast
(double)xみたいなC言語スタイルのキャストを警告します。static_cast使おう。
同じくJUCE自体のコードにも警告出ちゃうので使ってない。
-Weffc++
この記事のために調べてたら見つけた。gccでしか使えないがメモとして残す。
code: Weffc++
Scott Meyers の Effective C++ による次の方針に沿わない記述に警告を出す。
・動的確保を利用するクラスにはコピーコンストラクタと代入演算子を定義する。
・コンストラクタ内での代入より、メンバ初期化子を使う。
・operator=は*thisへの参照を返す。
・オブジェクトを返すべき時に、参照を返そうとしない。
・インクリメント・デクリメントの前置・後置を区別する。
(一般には、前置は参照を返すが、後置はconstコピーを返す)
・&&,||,,演算子をオーバーロードしない。
参考