warning: parameter ‘p’ set but not used 警告:引数 ‘p’ が上書き後未使用[-Wunused-but-set-parameter] ■引数更新しても呼び元変わらず(整数版) 時給… 続きを読む 【C言語】
ポインタが分からない
(ポインタのポインタを使う)
カテゴリー: gcc11 -Wall -Wextra(通常解析)
【C言語】
【C言語】
ヨーダ記法は
昭和のウサギ跳びと同じ臭い
今は-Werrorオプションで
if(x=0)のバグを防ごう
warning: suggest parentheses around assignment used as truth value 警告:真偽値として使用するなら代入式にカッコつける[-Wparentheses] ■… 続きを読む 【C言語】
ヨーダ記法は
昭和のウサギ跳びと同じ臭い
今は-Werrorオプションで
if(x=0)のバグを防ごう
【C言語】
設定後未使用変数が
未使用変数より危ない理由
(set but not used)
warning: variable ‘r2’ set but not used 警告:変数 ‘r2’ は設定されたが未使用[-Wunused-but-set-variable] ■1.コピペミスの可能性 設定後未使用の問… 続きを読む 【C言語】
設定後未使用変数が
未使用変数より危ない理由
(set but not used)
【C言語】
NULLにキャストするな!
不要なキャストを削除しよう
warning: cast from pointer to integer of different size 警告:ポインタ型を型幅の違う整数型にキャストした[-Wpointer-to-int-cast] ■memse… 続きを読む 【C言語】
NULLにキャストするな!
不要なキャストを削除しよう
【C言語】
0xFFFFffffが-1になり -1が255になる 暗黙の型変換とは?
warning: comparison of integer expressions of different signedness: ‘signed char’ and ‘unsigned int’ 警告:符号の異なる… 続きを読む 【C言語】
0xFFFFffffが-1になり -1が255になる 暗黙の型変換とは?
【C言語】
switch(enum式)と記述するとcase抜けを防げる
warning: enumeration value ‘x’ not handled in switch 警告:列挙値 ‘x’ がswitch文で処理されません。[-Wswitch] ■1.cas… 続きを読む 【C言語】
switch(enum式)と記述するとcase抜けを防げる
【C言語】0を無理にマクロにするとかえってマジックナンバーになる
■1.間違った理解・正しい理解 ●間違った理解マジックナンバーとは裸の数字の事である。マクロは裸の数字ではないのでマジックナンバーではない。●正しい理解マジックナンバーとは意味のわからない数字の事である。 ■2.無理に0… 続きを読む 【C言語】0を無理にマクロにするとかえってマジックナンバーになる
【C言語】
return(&自動変数)はバグ
warning: function returns address of local variable 警告:関数が自動変数のアドレスを返却した[-Wreturn-local-addr] ■1.自動変数のアドレスをret… 続きを読む 【C言語】
return(&自動変数)はバグ
【C言語】
デバッグ用printfを無効(空)にする方法
warning: left-hand operand of comma expression has no effect 警告:コンマ演算子の左側無意味[-Wunused-value] ■1.#ifdefだらけを避けたい… 続きを読む 【C言語】
デバッグ用printfを無効(空)にする方法
【C言語】
for文回り過ぎ?
(バッファオーバーラン)
warning: iteration 1024 invokes undefined behavior 警告:ループカウンタ 1024 で未定義動作[-Waggressive-loop-optimizations] ■失敗… 続きを読む 【C言語】
for文回り過ぎ?
(バッファオーバーラン)
【C言語】
整数を扱うならばint型を使おう
除夜の鐘を数える変数の型は?
warning: cast from ‘char *’ to ‘int *’ increases required alignment from 1 to 4 警告:整数を… 続きを読む 【C言語】
整数を扱うならばint型を使おう
除夜の鐘を数える変数の型は?
【C言語】
malloc(strlen(src))
終端文字’¥0’の1byte足りない
warning: ‘strcpy’ writing one too many bytes into a region of a size that depends on ‘strlen’ 警告:strlen()で確保した… 続きを読む 【C言語】
malloc(strlen(src))
終端文字’¥0’の1byte足りない
【C言語】memset()第3引数で sizeof(ポインタ変数名)は
多分バグ
warning: argument to ‘sizeof’ in ‘memset’ call is the same expression as the destination; 警告: ‘sizeof(ポイ… 続きを読む 【C言語】memset()第3引数で sizeof(ポインタ変数名)は
多分バグ
【C言語】
【|】と【||】、【&】と【&&】の違い短絡評価とは?
■1.【|】と【||】の違い ●on()|off() |はビット演算子なので両辺の関数は必ず呼ばれる(評価される)1|01=1=真なのでthenが表示される。 ●on()||off()) ||は論理演算子なのでon()… 続きを読む 【C言語】
【|】と【||】、【&】と【&&】の違い短絡評価とは?
【C言語】”文字列”とは
【単なるchar *】。
【符号無しchar *】ではなく
【符号付きchar *】でもない
warning: pointer targets in passing argument 1 of ‘strcpy’ differ in signedness 警告: ‘strcpy’ の第一引数… 続きを読む 【C言語】”文字列”とは
【単なるchar *】。
【符号無しchar *】ではなく
【符号付きchar *】でもない
【C言語】配列の添え字に文字型charを避け整数型intを使おう
warning: array subscript has type ‘char’ 警告:配列の添え字にchar 型[-Wchar-subscripts] ■1.配列の添え字に不適切なchar型 char型は符号付きか、符… 続きを読む 【C言語】配列の添え字に文字型charを避け整数型intを使おう
【C言語】
for文第一式で初期化しないならば何も書かなくてOK
warning: statement with no effect 警告:何の効果も無い式や文[-Wunused-value] ■1.代表的な無効式 i == 0; ■2.無効式はエラーにならない ■3.for文第1式で… 続きを読む 【C言語】
for文第一式で初期化しないならば何も書かなくてOK
【C言語】
if文のセミコロンが多すぎても
コンパイルエラーにならない
warning: suggest braces around empty body in an ‘if’ statement 警告:if文の中の空のボディを波括弧で囲むことを推奨します。[-Wempty-body] ■1… 続きを読む 【C言語】
if文のセミコロンが多すぎても
コンパイルエラーにならない
【C言語サンプル】
今時の Hello world!
(C89/90を捨てC99へ移行)
c99仕様のC言語ではmain 末尾の return 0 は書かなくてもOK! C89仕様のC言語:30年以上前の古い仕様 gcc hello.c -Wall -std=c89 でコンパイルするとgccにmain のre… 続きを読む 【C言語サンプル】
今時の Hello world!
(C89/90を捨てC99へ移行)
【C言語の演算子】
ビット演算子の優先順位は危険
if(x & 2 == 2)はバグ
warning: suggest parentheses around comparison in operand of ‘&’ 警告:&ビット演算子の回りにカッコつけよう[-Wparentheses] … 続きを読む 【C言語の演算子】
ビット演算子の優先順位は危険
if(x & 2 == 2)はバグ
【C言語】
文字列末尾の終端文字¥0は
自分で書かなくてOK
warning: embedded ‘\0’ in format 警告:書式中に終端文字¥0があると書式終了[-Wformat-contains-nul] ■1.末尾の¥0は自分で書かなくてOK 文字列リテラルの終端文字… 続きを読む 【C言語】
文字列末尾の終端文字¥0は
自分で書かなくてOK
【C言語】変数のアドレスは必ずあるのでNULLにならない (アドレスの無い変数は無い)
warning: the address of ‘i’ will always evaluate as ‘true’ 警告:’i’のアドレスは常に真として評価されます。[-Waddress] ■1… 続きを読む 【C言語】変数のアドレスは必ずあるのでNULLにならない (アドレスの無い変数は無い)
【C言語】
未使用引数警告の消し方 (unused parameter)
warning: unused parameter ‘argc’ 警告:未使用引数[-Wunused-parameter] ■1.未使用引数の警告が出る例 未使用引数を削除できないか検討しましょう。不要な引数であるならば… 続きを読む 【C言語】
未使用引数警告の消し方 (unused parameter)
【C言語】
switch(狭い型)
case 大き過ぎ
warning: case label value exceeds maximum value for type 警告:caseの値が型の最大値を超えています[-Wswitch-outside-range] ■1.swi… 続きを読む 【C言語】
switch(狭い型)
case 大き過ぎ
【C言語】
恒真式(常に真)/恒偽式(常に偽)
(tautological)
warning: overlapping comparisons always evaluate to true 警告: 重複する比較は常に真と評価される[-Wtautological-overlap-compare] … 続きを読む 【C言語】
恒真式(常に真)/恒偽式(常に偽)
(tautological)
【C言語】文字配列に終端文字¥0を入れる隙間が無い時はstrNcpyよりC99構造体の指示初期化子が便利
warning: ‘strncpy’ output truncated before terminating nul copying 8 bytes from a string of the same length 警告… 続きを読む 【C言語】文字配列に終端文字¥0を入れる隙間が無い時はstrNcpyよりC99構造体の指示初期化子が便利
【C言語】
if(a||b&&c)が【||】でなく【&&】で改行してたら怪しい
warning: suggest parentheses around ‘&&’ within ‘||’ 警告:A||B&&Cは A||(B&&C) と同じで (A||… 続きを読む 【C言語】
if(a||b&&c)が【||】でなく【&&】で改行してたら怪しい
【C言語未使用変数】
2行増やすな1行削れ
(unused variable)
warning: unused variable ‘yagni’ 警告:未使用変数 ‘yagni’ [-Wunused-variable] ■1.この行を削ろう /* 削除開始 */ ⇦ コメントを追加しないで// 削除… 続きを読む 【C言語未使用変数】
2行増やすな1行削れ
(unused variable)
【C言語】
デッドコード (冗長コード)
*p++ の *
warning: value computed is not used 警告:計算された値は使用されません[-Wunused-value] ■1.*p++は代表的なデッドコード *p++ の * がデッドコードです。この… 続きを読む 【C言語】
デッドコード (冗長コード)
*p++ の *
【C言語】
ちゅうぶらりんのelse
(dangling-else)
warning: this ‘if’ clause does not guard… 警告:誤解を招く段落を避け{ }を付けよう[-Wmisleading-indentation] ■1.紛らわしい段落 {}カッコが無いの… 続きを読む 【C言語】
ちゅうぶらりんのelse
(dangling-else)
【C言語】
既にある標準関数を自作するな
(車輪の劣化再発明)
warning: conflicting types for built-in function ‘memcpy’; 警告:組み込み関数 ‘memcpy’ の型の不一致[-Wbuiltin-dec… 続きを読む 【C言語】
既にある標準関数を自作するな
(車輪の劣化再発明)
【C言語】よくある誤字
switch文でdefaultのスペルミスはエラーにならない
warning: label ‘defalt’ defined but not used 警告:ラベル ‘defalt’ は定義されているが使用されていない[-Wunused-label] ■1.… 続きを読む 【C言語】よくある誤字
switch文でdefaultのスペルミスはエラーにならない
【C言語】
strcpy()をstrNcpy()に置き換えても安全とは限らない
warning: argument to ‘sizeof’ in ‘strncpy’ call is the same expression as the source; 警告:転送元のサイズではなく転送先のサイズでは?… 続きを読む 【C言語】
strcpy()をstrNcpy()に置き換えても安全とは限らない
【C言語】
コンパイラによっては
int型の 1ビットフィールドは
【0/-1】しか取れない
warning: comparison is always false due to limited range of data type 警告:データ型の範囲制限ため比較は常に偽になります。[-Wtype-limits… 続きを読む 【C言語】
コンパイラによっては
int型の 1ビットフィールドは
【0/-1】しか取れない
【C言語】
if(“文字列”==”文字列”)は 文字列領域のアドレス比較で 文字列比較とは違う
warning: comparison with string literal results in unspecified behavior 警告:文字列リテラルに対する比較の結果は未規定動作です。代わりにstrcmp… 続きを読む 【C言語】
if(“文字列”==”文字列”)は 文字列領域のアドレス比較で 文字列比較とは違う
【C言語】
/*fallthrough*/ switch文でbreakしない時の コメントの書き方
warning: this statement may fall through 警告:多分 break忘れ(フォールスルー)[-Wimplicit-fallthrough=] ■1.break忘れの例 switch文が… 続きを読む 【C言語】
/*fallthrough*/ switch文でbreakしない時の コメントの書き方
【C言語】switch( bool式)を避けif文で単純に書こう(KISSの原則)
warning: switch condition has boolean value 警告:switch(条件式)がブール値を持つ[-Wswitch-bool] ■1.switch(bool式)は避ける switch文… 続きを読む 【C言語】switch( bool式)を避けif文で単純に書こう(KISSの原則)
【C言語】
bool式は【0/1】以外にならない
warning: comparison of constant ‘2’ with boolean expression is always false 警告:定数 ‘2’ と真偽値式の比較は常に偽… 続きを読む 【C言語】
bool式は【0/1】以外にならない
【C言語】
配列の要素数とサイズは違う
sizeの変数名で誤解する
warning: ‘memset’ used with length equal to number of elements without multiplication by element size 警告:memse… 続きを読む 【C言語】
配列の要素数とサイズは違う
sizeの変数名で誤解する
【C言語】
配列をずらす時は
memcpyではなくて
memmoveを使おう (restrict)
warning: ‘builtin_memcpy’ accessing 9 bytes at offsets 1 and 0 overlaps 8 bytes at offset 1 警告:転送領域が重なったのでrest… 続きを読む 【C言語】
配列をずらす時は
memcpyではなくて
memmoveを使おう (restrict)
【C言語】
文字列が空かどうか終端文字¥0を使って判定する方法
■null判定って書くのは止めよう! 【null判定】【ヌル判定】【ナル判定】って書くのは止めよう! 【NULLポインタ判定】【空文字列判定】【終端文字¥0判定】と書こう。 ■推奨例:空文字列を判定する関数 NULLポイ… 続きを読む 【C言語】
文字列が空かどうか終端文字¥0を使って判定する方法
【C言語】
関数マクロはなるべく避ける
do~while(0)マクロより
inline関数を使おう
warning: macro expands to multiple statements 警告:マクロは複文に展開される[-Wmultistatement-macros] ■1.危険な複文マクロ MACRO_3line… 続きを読む 【C言語】
関数マクロはなるべく避ける
do~while(0)マクロより
inline関数を使おう
【C言語】
¥0は[ヌル文字(NULL文字)]ではなく[終端文字¥0]と書こう
warning: comparison between pointer and zero character constant 警告:ポインタと終端文字’\0’との比較[-Wpointer-compare] ■1.ポイン… 続きを読む 【C言語】
¥0は[ヌル文字(NULL文字)]ではなく[終端文字¥0]と書こう
【C言語】
標準関数のプロトタイプ宣言は既に標準ヘッダに書いてるので#includeすればOK
warning: implicit declaration of function ‘strcpy’ 警告:関数’strcpy’の暗黙の宣言[-Wimplicit-function-declara… 続きを読む 【C言語】
標準関数のプロトタイプ宣言は既に標準ヘッダに書いてるので#includeすればOK
【C言語】
デッドコード(到達不能コード)
switch文内で初期値のある変数宣言
warning: statement will never be executed 警告:宣言時の代入文が実行されることはない[-Wswitch-unreachable] ■1.case文が無くてもエラーにならない 意味… 続きを読む 【C言語】
デッドコード(到達不能コード)
switch文内で初期値のある変数宣言
【C言語】
ビット反転【~】と
論理反転【!】の違い
■1.【チルダ~】対【ビックリマーク!】 ●ビット反転【チルダ~】1 ⇒~ビット反転 ⇒0xFFFFfffE(2進数1111…0)0 ⇒~ビット反転 ⇒0xFFFFfffF(2進数1111…1) … 続きを読む 【C言語】
ビット反転【~】と
論理反転【!】の違い
【C言語】
bool型を++してはいけない(increment of a bool expression)
warning: increment of a boolean expression 警告:真偽値(0/1)しか取れないbool型を加算した[-Wbool-operation] ■1.bool型を++/--してはいけない… 続きを読む 【C言語】
bool型を++してはいけない(increment of a bool expression)
【C言語 】
sizeof(配列)/sizeof(配列[0]) 配列の要素数を求める技は ポインタには使えない
warning: division ‘sizeof (int *) / sizeof (int)’ does not compute the number of array elements 警告:’size… 続きを読む 【C言語 】
sizeof(配列)/sizeof(配列[0]) 配列の要素数を求める技は ポインタには使えない
【C言語】
配列の要素数を求める時はsizeof(配列の型)ではなくてsizeof(配列名[0])と書こう
warning: expression does not compute the number of elements in this array 警告:この計算式では配列の要素数は求まりません。[-Wsizeof-ar… 続きを読む 【C言語】
配列の要素数を求める時はsizeof(配列の型)ではなくてsizeof(配列名[0])と書こう
【C言語】ゼロ除算の
見つけ方とガード処理
(Divide By Zero)
warning: division by zero 警告:ゼロ除算[-Wdiv-by-zero] ■1.ゼロ除算を見つけるのは難しい コンパイラの警告や静的解析ツールを使用してもゼロ除算を見つけるのは難しい。 人海戦術で… 続きを読む 【C言語】ゼロ除算の
見つけ方とガード処理
(Divide By Zero)
【C言語】
無限ループが発生する
for文のバグ
(infinite loop)
warning: comparison is always true due to limited range of data type 警告:データ型の幅が限られているため、比較は常に真である。[-Wtype-limi… 続きを読む 【C言語】
無限ループが発生する
for文のバグ
(infinite loop)
【C言語】
絶対値を求めるabs(整数)とfabs(浮動小数点)
warning: using integer absolute value function ‘abs’ when argument is of floating-point type ‘double’ 警告:引数が浮動… 続きを読む 【C言語】
絶対値を求めるabs(整数)とfabs(浮動小数点)