■右詰め%3d ■左詰め%-3d ■零埋め%03d ■まとめ(コンパイル可能) ■実行結果
【C言語】
【C言語】
fopen/fclose/fgets/fputsを使った単純なcat風コマンド
警告: 指定したファイルを標準出力するだけ ■単純なcat風コマンド こんな時に役に立ちます。 (1)forとwhileどちらを使うか悩んだ時(2)fgets()の引数の順番を忘れた時(3)fputs()の引数の順番を忘… 続きを読む 【C言語】
fopen/fclose/fgets/fputsを使った単純なcat風コマンド
【C言語】
エネルギー充填120%と書きたい
warning: invalid conversion specifier ‘\x0a’ [-Wformat-invalid-specifier] 警告: 無効な変換指定子 ‘ \x0… 続きを読む 【C言語】
エネルギー充填120%と書きたい
【C言語】
free(ptr)しても
ptrはNULLにならない
■何と表示されますか? freeしたらfree関数がポインタをNULLにしてくれると思っている人!残念ですが間違っています。 参考: CFAQ-4.8: 呼んだ側のポインターの値は変わらなかった。
【C言語】
fclose()忘れた!
デバッグ関数がバグってる
warning: leak of FILE ‘fp’ [CWE-775] 警告: fclose忘れ[-Wanalyzer-file-leak] ■デバッグ関数のバグ 何度もfopen()を実行してfclose()していな… 続きを読む 【C言語】
fclose()忘れた!
デバッグ関数がバグってる
【C言語】strchr関数の返り値をチェックする
■返り値のNULLチェックを手抜きする このプログラムは返り値のNULLチェックを行っていないので、カンマが見つからないとNULLポインタ間接参照が発生して異常終了する可能性があります。 ■返り値のNULLチェックをする… 続きを読む 【C言語】strchr関数の返り値をチェックする
【C言語】
2次元配列は止めておけ
(新幹線の停車駅)
warning: initializer-string for char array is too long 警告:文字列長は人間が数えてはダメ[-Wexcess-initializers] ■推奨しない2次元配列 この… 続きを読む 【C言語】
2次元配列は止めておけ
(新幹線の停車駅)
【C言語】
論理演算子a||b&&cの
結合規則と評価順序は別
warning: ‘&&’ within ‘||’ 警告:a||b&&cはa||(b&&c)と同じで(a||b)&&… 続きを読む 【C言語】
論理演算子a||b&&cの
結合規則と評価順序は別
【C言語】64bitへ移行(gcc版)
■long 32bit=4byteではなくなったがintは32bitのまま gcc LP64モードで long は64bit=8byteです。U4の様な型定義はサイズが変わってしまいます。よく間違えますがLP64モードで… 続きを読む 【C言語】64bitへ移行(gcc版)
【C言語】 static関数のプロトタイプ宣言を書くのが面倒臭いと思うのが正しい
■static関数のプロトタイプ宣言を書くのが面倒くさい 業務で、「ソースコードを上から下へ読めるようにmain()関数を上に書く」とルール化して、static関数のプロトタイプ宣言を何百行もコメント付きで記述するプロジ… 続きを読む 【C言語】 static関数のプロトタイプ宣言を書くのが面倒臭いと思うのが正しい
【C言語】enum では最初の定数は非ゼロにするか、あるいはエラーを示すものにする
■デバッグを楽にする小技 上記のプログラムでenumの先頭でSun=1の設定をしていないと、初期化していない xを引数にしてnum2Week(x)を呼んだ場合”日曜日”が表示され(る事が多く)問題検出が困難となる。 参考… 続きを読む 【C言語】enum では最初の定数は非ゼロにするか、あるいはエラーを示すものにする
【C言語】
深いネストは理解しにくいので条件をひっくり返して早く返るとネストが浅くなる
■深いネストは理解しにくい ■条件をひっくり返して早く返るとネストが浅くなる ネストが浅くなりコードが単純になります。 ■まとめ(コンパイル可能な検算)
【C言語】マルチステートメントの勧め
■シングルステートメント ■マルチステートメント(推奨) 表のように書ける時は、ぱっと見ただけで瞬間的に理解できるのでマルチステートメントがお勧めです。 参考: プログラム言語 C の推奨されるスタイルとコーディング規範… 続きを読む 【C言語】マルチステートメントの勧め
Cだと思っていたらC++だった
error C2440: ‘初期化中’: ‘void *’ から ‘char *’ に変換できません。 警告:C言語なのにC++コンパイラ使ってる?… 続きを読む Cだと思っていたらC++だった
【C言語】
ダングリングポインタ
(Dangling Pointer)の見つけ方
warning: Use of memory after it is freed 警告:無効な領域を指しているポインタ [clang –analyze] ■解放済み領域を指すダングリングポインタ ■終了した自… 続きを読む 【C言語】
ダングリングポインタ
(Dangling Pointer)の見つけ方
【C言語】
バッファオーバーフロー
(buffer overflow)の見つけ方
ERROR: AddressSanitizer: stack-buffer-overflow on address [gcc -fsanitize=addres][gcc -Wall -Wextra -O3] ■バッファ… 続きを読む 【C言語】
バッファオーバーフロー
(buffer overflow)の見つけ方
【C言語】strcpyとstrcat関数をダラダラ書いて文字列連結しないでsprintfを使う
■strcpy+strcatをダラダラ書く 編集後のイメージがわかりにくいです。 ■sprintfで1行で書く 編集後のイメージがつかみやすいです。 ■まとめ(コンパイル可能) ■実行結果
【C言語】double-fclose
(CWE-1341)
warning: double ‘fclose’ of FILE ‘fp’ warning: leak of FILE ‘fp’ 警告: fclose多すぎ、少なすぎ[-Wanalyzer-double-fclose][… 続きを読む 【C言語】double-fclose
(CWE-1341)
【C言語】
mallocによるリスト構造と
Use-After-Freeのバグ
warning: use after ‘free’ of ‘p’ 警告:メモリの解放後参照[-Wanalyzer-use-after-free] ■use-after-freeのバグ例 free(p) でp を解放した後… 続きを読む 【C言語】
mallocによるリスト構造と
Use-After-Freeのバグ
【C言語】
strstr関数を使ってコードの不吉な臭いを見つける
■駄目語(grep -f NGワード相当) 駄目語録[]の単語は開発環境で異なります。ご自身の環境に応じて追加削除してください。
【C言語】
size_t型のprintf書式は %zu,%zx
warning: format specifies type ‘int’ but the argument has type ‘unsigned long’ 警告: %dは… 続きを読む 【C言語】
size_t型のprintf書式は %zu,%zx
【C言語】
mallocにキャストは
今時のCコンパイラでは必要ない
error C2440: ‘初期化中’: ‘void *’ から ‘char *’ に変換できません。 警告:C言語なのにC++コンパイラ使ってる?… 続きを読む 【C言語】
mallocにキャストは
今時のCコンパイラでは必要ない
gcc-Wallは警告全部ではない
warning: duplicated ‘if’ condition 警告:if文の条件式が重複 [-Wduplicated-cond][-Wduplicated-branches] ■then節とelse節が同じ 新規… 続きを読む gcc-Wallは警告全部ではない
【C言語】
【<】と【<<】を間違える
warning: ‘<<’ in boolean context, did you mean ‘<’? 警告:<<でなくて<では? [-Wint-in-bool-context] ■【… 続きを読む 【C言語】
【<】と【<<】を間違える
【C言語】
コーディング規約で
思考が止まる
ブラックルールとは?
■嫌いなブラックルール ・char/short/int/long を直接記述する事禁止する・数値を直接記述すること禁止、必ずマクロにする事・変数の宣言は関数の先頭でまとめて行い別の行で全てゼロで一律もれなく初期化する事・… 続きを読む 【C言語】
コーディング規約で
思考が止まる
ブラックルールとは?
【C言語】
今時(C99仕様)の変数宣言と
時代遅れのとりあえず0で初期化
■時代遅れの変数宣言と初期化(非推奨) (1)変数宣言(2)とりあえず0で初期化(3)本当の値設定の3部構成からなるC89仕様時代のよくあるスタイルです。 14行目でyの初期化が漏れているので未初期化の警告が出ます。20… 続きを読む 【C言語】
今時(C99仕様)の変数宣言と
時代遅れのとりあえず0で初期化
【C言語】
Segmentation fault(コアダンプ)を調べる方法
■静的解析で敵を見つける ●gcc -Wall -Wextra -Oでコンパイルして警告を直す clang -Wall -Wextra -Oでもコンパイルして警告を直しましょう。 ●gcc -fanalyzer -O2で… 続きを読む 【C言語】
Segmentation fault(コアダンプ)を調べる方法
【C言語サンプル】
年月日から曜日を求める
■ツェラー(Zeller)の公式で曜日を求める 年月日から曜日を求めるのに有名なツェラーの公式をC言語化してます。 1月2月が前年の13月14月になったり、4,100,400の閏年関連の定数が 筆者には難解なので、オリジ… 続きを読む 【C言語サンプル】
年月日から曜日を求める
【C言語サンプル】
日付の引き算を年月日で表示
■サンプルコード 遊び方 $./a.out 1998/08/10 コピペしコンパイル&実行し、動作確認をして下さい。
【C言語サンプル】
GNU拡張機能のswitchを使って西暦を和暦(元号)に変換
■西暦を和暦(元号)に変換 例: 2023/06/03 ->令和/5年/06/03 GNUの拡張機能を使用するとcase 18680908 … 19120729:のように、case 文の範囲指定が出来ます。 gcc… 続きを読む 【C言語サンプル】
GNU拡張機能のswitchを使って西暦を和暦(元号)に変換
【C言語】
char *argv[]は
2次元配列と違う
■char *argv[]サンプルコード ■2次元配列サンプルコード ■argvと2次元配列の違い このプログラムの場合 (1) 2次元配列は末尾に番兵のNULLポインタを置けない。(2) 2次元配列は行 x 列のメモリ… 続きを読む 【C言語】
char *argv[]は
2次元配列と違う
【C言語サンプル】
コマンドラインから3つの整数を入力し大きい順に並べる
■max()/min()マクロの使用例 遊び方 $./a.out 1 10 5 コピペしコンパイル&実行し、動作確認をして下さい。
【C言語】
オーバーフローと
オーバーランの違い
(overFlow VS overRun)
warning: unsigned conversion from ‘int’ to ‘unsigned char’ changes value from ‘305419896’ to ‘120’ 警告: ‘… 続きを読む 【C言語】
オーバーフローと
オーバーランの違い
(overFlow VS overRun)
【C言語サンプル】
union(共用体)を使った エンディアン変換
■16bit(2byte)をスワップする ■32bit(4byte)をスワップする ■64bit(8byte)をスワップする ■標準関数を使ったバイトスワップ ■union(共用体)を使ったスワップ(まとめ)
【C言語サンプル】
西暦から干支を求める
■strcpyを使って干支を求める 意図した動きをしますが記述量が多くて、処理速度も遅いです。。 strcpyで文字列を返却値に使う配列にわざわざコピーしていますが無駄です。 ■文字列リテラルを使って干支を求める str… 続きを読む 【C言語サンプル】
西暦から干支を求める
【C言語サンプル】
円周率の求め方 (ライプニッツの公式)
■円周率の求め方ソース全文 ●ライプニッツの公式使用 π/4 = 1 – 1/3 + 1/5 – 1/7 + 1/9 – 1/11 + … ●M_PIやM_PILは標準じゃないそうです… 続きを読む 【C言語サンプル】
円周率の求め方 (ライプニッツの公式)
【C言語】
自作のstrlen/strncpy/strncmpは標準関数の5~6倍遅かった
■1.パチモノ自作関数を実務で作ってはいけない と別の投稿でも書きましたが どのくらい処理速度が違うのかmem系関数に続いてsrc系関数を自作関数と標準関数で比較してみました。 ■2.自作関数vs標準関数 やっている事は… 続きを読む 【C言語】
自作のstrlen/strncpy/strncmpは標準関数の5~6倍遅かった
【C言語】
sscanf関数の正規表現で
csvファイルを解析し
郵便番号から住所を表示
■このコードで学習できること ・scanfの正規表現・コメントの書き方 ■郵便番号⇒住所プログラム コピペしてコンパイル&実行してみて下さい。 ■製造年と作者名をコメントで明示すると高品質になる 経験則ですが、ファイルヘ… 続きを読む 【C言語】
sscanf関数の正規表現で
csvファイルを解析し
郵便番号から住所を表示
【C言語サンプル】
根性のない電卓
■このコードは手抜きです ・ゼロ割り算をガードしていません。・1+1は出来ますが、1+1+1は出来ません・+-*/の四則演算しか出来ません・演算子が2文字以上の考慮はしていません(<<とか) ■このコードで学… 続きを読む 【C言語サンプル】
根性のない電卓
【C言語】
キャッシュの有無で
二次元配列参照の処理速度は
物凄く違う
■1.要するに安近短が百倍早いらしい for(x;for(yとfor(y;for(xの処理速度を比較してみました。 ■2.for(x;for(y対for(y;for(x やっている事はどちらも2次元配列を文字’QR… 続きを読む 【C言語】
キャッシュの有無で
二次元配列参照の処理速度は
物凄く違う
【C言語】
自作のmemset/memcpy/memcmpは標準関数の20倍遅かった
■1.パチモノ自作関数を実務で作ってはいけない と別の投稿でも書きましたがどのくらい処理速度が違うのか自作関数と標準関数を比較してみました。 ■2.自作関数vs標準関数 やっている事はコピー元の自動変数配列を文字Qで埋め… 続きを読む 【C言語】
自作のmemset/memcpy/memcmpは標準関数の20倍遅かった
【C言語サンプル】
csvファイルを読んで構造体に設定する
■構造体の使い方に慣れましょう コピペしてコンパイル&実行して動作を確認してください。 ■input.csvの例
【C言語サンプル】
strtok関数を使って文字列を単語に分解する方法
■strtokの意味 strtok=string+tokenstring=文字列token=単語strtokは文字列を単語に分解する関数です。 ■strtok関数の使用例 コンパイル&実行してみて下さい。 ※window… 続きを読む 【C言語サンプル】
strtok関数を使って文字列を単語に分解する方法
【C言語】
関数ポインタを使った
配列vsポインタの処理時間計測
■配列vsポインタ 文字列定数を変数に設定する際、以下のように配列とポインタで似たような記述が出来ます。char ary[1024] = “string”;char *ptr = “s… 続きを読む 【C言語】
関数ポインタを使った
配列vsポインタの処理時間計測
【C言語サンプル】
構造体ポインタの使い方
■単純な構造体メンバの参照 ■間接演算子 * と構造体ポインタ 読みにくいのでこのスタイルは通常使用されません。 ■アロー演算子 -> と構造体ポインタ 「構造体ポインタの指す先のメンバ」と自然に読めるので通常このスタイ… 続きを読む 【C言語サンプル】
構造体ポインタの使い方
【C言語】
ポインタが分からない
(ポインタのポインタを使う)
warning: parameter ‘p’ set but not used 警告:引数 ‘p’ が上書き後未使用[-Wunused-but-set-parameter] ■引数更新しても呼び元変わらず(整数版) 時給… 続きを読む 【C言語】
ポインタが分からない
(ポインタのポインタを使う)
【C言語】
ヨーダ記法は
昭和のウサギ跳びと同じ臭い
今は-Werrorオプションで
if(x=0)のバグを防ごう
warning: suggest parentheses around assignment used as truth value 警告:真偽値として使用するなら代入式にカッコつける[-Wparentheses] ■… 続きを読む 【C言語】
ヨーダ記法は
昭和のウサギ跳びと同じ臭い
今は-Werrorオプションで
if(x=0)のバグを防ごう
【C言語サンプル】
配列の中から 最大値と最小値を見つける
■1.サンプルコード コピペしコンパイル&実行し動作確認してください。 ■2.昔風の書き方でバグのあるサンプルコード このソースコードはバグっているので真似しないでください。力試しに正しく動くように直してみましょ… 続きを読む 【C言語サンプル】
配列の中から 最大値と最小値を見つける
【C言語サンプル】
今時(C99仕様)の構造体初期化
■構造体の宣言 ■C99仕様の構造体の定義と初期化 ■構造体ポインタを使ったメンバ表示 ■構造体に慣れましょう コピペしてコンパイル&実行して動作を確認してください。
【C言語】
strNcpyとmemcpyの違い
■1.strNcmpとmemcmpが違う例 ●違いその1 strncmp()は終端文字¥0までしか比較しないmemcmp()は終端文字¥0を超えて比較する。 ●違いその2 strncmp()の第1,第2引数には char… 続きを読む 【C言語】
strNcpyとmemcpyの違い
【C言語】
デッドコード (冗長コード)
return x++;
warning: Value stored to ‘x’ is never read 警告:’x’に格納された値が読み出されない[clang-analyzer-deadco… 続きを読む 【C言語】
デッドコード (冗長コード)
return x++;
【C言語】
Shift_JISで書いたプログラムをgcc/clangでコンパイルしてはいけない
■1.gccでエラーにならないので困る このプログラムがShift_JISで書かれている場合、いわゆる5C問題で全部コメントになります。 gccで何のエラーもなくコンパイルできますが何もしないプログラムとなります。 エラ… 続きを読む 【C言語】
Shift_JISで書いたプログラムをgcc/clangでコンパイルしてはいけない
【C言語】
printf(“%zu\n”,strlen(“全角”)); 全角は2バイト固定か?
■1.次のプログラムは何と表示されますか? ■2.ソースコードがEUCの場合 プログラマの期待した結果になります。 ■3.ソースコードがShift_JISの場合 プログラマの期待した結果にこの例ではなりましたが、 gcc… 続きを読む 【C言語】
printf(“%zu\n”,strlen(“全角”)); 全角は2バイト固定か?
【C言語】
早期リターンvs関数出口1つ
■1.早期リターンは読みやすい(推奨) コーディング規約 「関数の出口1つだけ」を強要するプロジェクトは多いです。 しかしこのルールを守った読みやすいコードを見たことがありません。 規約を強要する人は是非ともリーダブルコ… 続きを読む 【C言語】
早期リターンvs関数出口1つ
【C言語】
設定後未使用変数が
未使用変数より危ない理由
(set but not used)
warning: variable ‘r2’ set but not used 警告:変数 ‘r2’ は設定されたが未使用[-Wunused-but-set-variable] ■1.コピペミスの可能性 設定後未使用の問… 続きを読む 【C言語】
設定後未使用変数が
未使用変数より危ない理由
(set but not used)
【C言語】
reallocのエラー処理でよくあるメモリリーク
(error) Common realloc mistake: ‘p’ nulled but not freed upon failureera エラー:reallocに失敗したが古い領域は解放さ… 続きを読む 【C言語】
reallocのエラー処理でよくあるメモリリーク
【C言語】
外部変数に短い名前i,j,kを付けてはいけない
warning: declaration shadows a variable in the global scope 警告:宣言が外部変数を隠す[-Wshadow] ■1.i,j,k等を外部変数で宣言してはいけない グ… 続きを読む 【C言語】
外部変数に短い名前i,j,kを付けてはいけない
【C言語】
free(&自動変数)はバグ
(Free of Memory not on the Heap)
warning: ‘free’ called on unallocated object ‘自動変数’ 警告:自動変数の解放は未定義の動作[-Wfree-nonheap-object] ■1.自動変数を自分で解放してはい… 続きを読む 【C言語】
free(&自動変数)はバグ
(Free of Memory not on the Heap)
【C言語】mallocとfreeの問題
メモリリークを予防する (memory leak)
warning: leak of ‘malloc’ 警告:メモリ解放漏れ[-Wanalyzer-malloc-leak] ■malloc-leakの例 malloc()で確保した領域を解放し忘れると解放漏れ(メモリリーク… 続きを読む 【C言語】mallocとfreeの問題
メモリリークを予防する (memory leak)
【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言語】
論理否定演算子!の
よくある間違い
if(!x==0){if(!x & y);}
warning: logical not is only applied to the left hand side of this comparison 警告:!の結合力は==よりも強い[-Wlogical-not-p… 続きを読む 【C言語】
論理否定演算子!の
よくある間違い
if(!x==0){if(!x & y);}
【C言語】
sizeof演算子は関数ではない
strlen()でもない
■1.sizeof演算子は関数ではない sizeof演算子を関数だと思っている人は結構多く、この人達は【sizeofの戻り値】って書くのだけれど、1+1の戻り値って言わないですよね。 聖典プログラミング言語C A7.4.… 続きを読む 【C言語】
sizeof演算子は関数ではない
strlen()でもない
【C言語】
初期化されていない自動変数
(ローカル変数)の値はゴミ
warning: ‘ptr’ is used uninitialized 警告:未初期化変数を使用した[-Wuninitialized] ■1.初期化されていない自動変数の問題例 初期化していない自動変数の値はゴミです。… 続きを読む 【C言語】
初期化されていない自動変数
(ローカル変数)の値はゴミ
【C言語】
二重解放(double free)対策の
よくある間違い
warning: double-‘free’ of ‘p’ [CWE-415] 警告:二重解放 [-Wanalyzer-double-free] ■1.二重解放のバグ例 二重解放はメモリが破壊され大きな問題になります。 … 続きを読む 【C言語】
二重解放(double free)対策の
よくある間違い
【C言語サンプル】
シーザー暗号 (ctype.hの使い方)
■1.シーザー暗号ソース全文 ■2.遊び方 $./a.out /usr/include/stdio.h↓暗号化したいファイル名を指定します。暗号化したファイル”encrypt.txt”と、復号化し… 続きを読む 【C言語サンプル】
シーザー暗号 (ctype.hの使い方)
【C言語サンプル】
10進数を2進数に 2進数を10進数に変換
■十進数値を二進文字列変換 intは32bitを前提としています。 ■二進文字列を十進数値に変換 ■使用例と検算 ■コード全部
【C言語サンプル】
qsort関数の使い方 整数配列、ポインタ配列、構造体配列の並べ替え
■4つの準備 qsortを使うには以下の4つを準備してください。(1)ソート対象の配列(2)配列要素数(3)配列一つのサイズ(4)比較関数 ■整数配列をqsort n1 – n2の引き算の結果で数値順にソート… 続きを読む 【C言語サンプル】
qsort関数の使い方 整数配列、ポインタ配列、構造体配列の並べ替え
【C言語サンプル】
素数の求め方
(剰余演算子%の使い方)
2は偶数だけれど素数 2は偶数だけれど素数なので2の偶数判定をループの外に出すと若干高速になります。
【C言語】2022年版
浮動小数点で float型はやめなさい float型対double型
■1.float型対double型 ●2003年初版のCプログラミング診断室で紹介されている「float型はやめなさい」をgcc11版で試してみた。●2022年現在でも「float型はやめなさい」だった。処理時間でも精度… 続きを読む 【C言語】2022年版
浮動小数点で float型はやめなさい float型対double型
【C言語】
for文とwhile文の使い分け
(1行vs4行)
■whileで記述すると4行も必要 while文は(1)変数宣言、(2)初期化式、(3)ループ条件、(4)更新式で4行も必要です。 ■for文なら1行で書けるので楽 変数宣言、初期化式、ループ条件、更新式が1行で書けます… 続きを読む 【C言語】
for文とwhile文の使い分け
(1行vs4行)
【C言語サンプル】
数字(1)を英語表記の月(January)に変換する方法
■数字の1を英語表記の月Januaryに変換する ■0月を捨てると 月名配列[mon-1]等の-1が不要になります。 ■C99式の指示付きの初期化子を使うと 「間違ってずれて初期化」する危険が減ります。
【C言語サンプル】
大文字小文字変換 (isupperとtolowerの使い方)
■標準ヘッダを使った例(推奨) ctype.hで定義されている標準関数を使うとコードが読みやすくなります。 変換対象が/usr/include/stdio.hのようにアスキーコードだけで記述されている場合このコードで動き… 続きを読む 【C言語サンプル】
大文字小文字変換 (isupperとtolowerの使い方)
【C言語サンプル】
rand乱数生成関数の使い方
(じゃんけんゲーム)
■乱数の種まき ●srand関数による乱数の種まきをしないと何回実行しても同じ結果となる●実務ではrand関数よりrandom関数を使う ■乱数を生成するrand関数の使い方 srand関数を使用して乱数の種を蒔かないと… 続きを読む 【C言語サンプル】
rand乱数生成関数の使い方
(じゃんけんゲーム)
【C言語サンプル】
閏年(うるう年)判定プログラム
warning: suggest parentheses around ‘&&’ within ‘||’ 警告:X&&Y||Zは(X&&Y)||Zと丸括弧を付けて[-Wpa… 続きを読む 【C言語サンプル】
閏年(うるう年)判定プログラム
【C言語】
文字列を比較する関数 strcmp()の戻り値は true/falseじゃない
warning: function ‘strcmp’ is compared to a suspicious constant 警告:strcmpの戻り値を0以外と比較するのは疑わしい[misc-… 続きを読む 【C言語】
文字列を比較する関数 strcmp()の戻り値は true/falseじゃない
【C言語】
switch文の中でreturn直後にbreakは必要か?
■1.何をしてるか1秒でわかるコードに caseがbreak で終わっていないので下記2大コーディングルールに違反します。 MISRA-C:2012 R16.3 違反CERT-C MSC17-C. 違反 ※CERT-C … 続きを読む 【C言語】
switch文の中でreturn直後にbreakは必要か?
【C言語】
switch(enum式)と記述するとcase抜けを防げる
warning: enumeration value ‘x’ not handled in switch 警告:列挙値 ‘x’ がswitch文で処理されません。[-Wswitch] ■1.cas… 続きを読む 【C言語】
switch(enum式)と記述するとcase抜けを防げる
【C言語】
デッドコード(到達不能コード)
if(x!=0){if(x==0){;}}
(warning): Opposite inner ‘if’ condition leads to a dead code block. 警告:矛盾する逆条件はデッドコードになる[(warning… 続きを読む 【C言語】
デッドコード(到達不能コード)
if(x!=0){if(x==0){;}}
【C言語】0を無理にマクロにするとかえってマジックナンバーになる
■1.間違った理解・正しい理解 ●間違った理解マジックナンバーとは裸の数字の事である。マクロは裸の数字ではないのでマジックナンバーではない。●正しい理解マジックナンバーとは意味のわからない数字の事である。 ■2.無理に0… 続きを読む 【C言語】0を無理にマクロにするとかえってマジックナンバーになる
【C言語】
スパゲティコードで未初期化変数が多発する
(Uninitialized Variable)
warning: ‘x’ may be used uninitialized in this function 警告:未初期化変数かも[-Wmaybe-uninitialized] ■1.スパゲティコード この警告が出る… 続きを読む 【C言語】
スパゲティコードで未初期化変数が多発する
(Uninitialized Variable)
【C言語】
return(&自動変数)はバグ
warning: function returns address of local variable 警告:関数が自動変数のアドレスを返却した[-Wreturn-local-addr] ■1.自動変数のアドレスをret… 続きを読む 【C言語】
return(&自動変数)はバグ
【C言語】
関数名や変数名に漢字を使うとものすごくわかりやすい
■1.変数名や関数名に漢字を使用した例 2022年令和4年現在gcc11,clangでコンパイル可能です!3秒もあれば処理内容が理解できるのでは? ■2.deepLで訳して書き直してみた DeepL翻訳サイトで訳してもら… 続きを読む 【C言語】
関数名や変数名に漢字を使うとものすごくわかりやすい
【C言語】
デバッグ用printfを無効(空)にする方法
warning: left-hand operand of comma expression has no effect 警告:コンマ演算子の左側無意味[-Wunused-value] ■1.#ifdefだらけを避けたい… 続きを読む 【C言語】
デバッグ用printfを無効(空)にする方法
【C言語】
gcc -pedanticを使う必要はない マニュアルを読もう
warning: wrong type argument to increment 警告:voidポインタ++はgcc拡張機能 [-Wpointer-arith] ■1.ヒステリックな警告が大量にあると 昔、高速道路に乗… 続きを読む 【C言語】
gcc -pedanticを使う必要はない マニュアルを読もう
【C言語】
for文回り過ぎ?
(バッファオーバーラン)
warning: iteration 1024 invokes undefined behavior 警告:ループカウンタ 1024 で未定義動作[-Waggressive-loop-optimizations] ■失敗… 続きを読む 【C言語】
for文回り過ぎ?
(バッファオーバーラン)
【C言語】
オーバーフローと ラップアラウンドの違い (overflow vs wrap around)
(error): Signed integer overflow for expression ‘y+2‘ 警告:’y+2’の計算で符号付き整数オーバーフロー[(error… 続きを読む 【C言語】
オーバーフローと ラップアラウンドの違い (overflow vs wrap around)
【C言語】
今時(C99仕様)のfor文
変数のスコープを狭くすると
コードを読むのが楽になる
(style):The scope of the variable ‘j’ can be reduced. (スタイル):変数 ‘j’ のスコープを縮小できる。[(styl… 続きを読む 【C言語】
今時(C99仕様)のfor文
変数のスコープを狭くすると
コードを読むのが楽になる
【C言語】
構造体を代入する方法
(メンバを個別代入しなくてOK)
■1.適切な構造体代入の例 同じ種類の構造体は一発で全部代入できます。 ■2.個別代入でメンバーを間違えた例 (warning): Redundant assignment of ‘dst->y’… 続きを読む 【C言語】
構造体を代入する方法
(メンバを個別代入しなくてOK)
【C言語】
sizeof演算子のよくある間違い
warning: suspicious usage of ‘sizeof(sizeof(…))’ 警告:’sizeof(sizeof(…))’ の疑わしい使用法。[misc… 続きを読む 【C言語】
sizeof演算子のよくある間違い
【C言語】
簡潔な式を書く時
三項演算子?:は便利
warning: operator ‘?:’ has lower precedence than ‘|’; ‘|’ will be evaluate… 続きを読む 【C言語】
簡潔な式を書く時
三項演算子?:は便利
【C言語】
無料でLinux上のプログラムを
静的解析する方法
cppcheck:clang –analyze:clang-tidy:gcc -fanalyzer
■1.おすすめのツールとオプション (1) clang -Weverything(2) clang –analyze(3) clang-tidy(4) gcc -Wall -Wextra(5) gcc -fa… 続きを読む 【C言語】
無料でLinux上のプログラムを
静的解析する方法
cppcheck:clang –analyze:clang-tidy:gcc -fanalyzer
【C言語】
64bit gccのintのサイズは
64bit(8byte)じゃない
(style): int result is returned as long value. If the return value is long to avoid loss of information, then … 続きを読む 【C言語】
64bit gccのintのサイズは
64bit(8byte)じゃない
【C言語】
ポインタは負になるか?
(void *)-1の使い方
warning: ordered comparison of pointer with integer zero 警告:整数の0とのポインタの比較[-Wextra] ■1.ポインタは負値にならない 成功時ポインタを返し失… 続きを読む 【C言語】
ポインタは負になるか?
(void *)-1の使い方
【C言語】
memsetのよくある間違い
■1.memsetのよくある間違い ■2.[(warning)memsetZeroBytes] 第3引数のサイズが0 ■3.[(portability)memsetFloat] 第2引数に指定できるのはint型だが実質u… 続きを読む 【C言語】
memsetのよくある間違い
【C言語】
プロトタイプ宣言と関数定義で引数の名前が違う
(style): Function ‘my_memset’ argument 3 names different: declaration ‘element’ defini… 続きを読む 【C言語】
プロトタイプ宣言と関数定義で引数の名前が違う
【C言語】冗長コード
(duplicate,identical,redundant)
(style): Consecutive return, break, continue, goto or throw statements are unnecessary. (スタイル):連続した return, br… 続きを読む 【C言語】冗長コード
(duplicate,identical,redundant)
【C言語】
ifとswitchどっちが良い?
(switch vs else if)
(style): Expression is always false because ‘else if’ condition matches previous condition at line… 続きを読む 【C言語】
ifとswitchどっちが良い?
(switch vs else if)
【C言語】
ビット演算子の不一致 (bitwise,bitmask,bit pattern)
■1.bitwise comparison always evaluates to true ■2.bitwise comparison always evaluates to false ■3.Mismatching … 続きを読む 【C言語】
ビット演算子の不一致 (bitwise,bitmask,bit pattern)
【C言語】
配列の添え字チェックを先に
if(buf[idx] && idx < MAX)
(style) Array index ‘idx’ is used before limits check. 警告:配列添え字を範囲チェック前に使った[(style)arrayIndexThenC… 続きを読む 【C言語】
配列の添え字チェックを先に
if(buf[idx] && idx < MAX)
【C言語】
冗長な条件 if(x > 10 && x > 11)
(Redundant condition)
(style) Redundant condition: If ‘x > 11’, the comparison ‘x > 10’ is always true… 続きを読む 【C言語】
冗長な条件 if(x > 10 && x > 11)
(Redundant condition)
【C言語】ポインタのオーバーフローは未定義動作
(warning) Comparison is wrong. Result of ‘p+1’ can’t be 0 unless there is pointer overflow, … 続きを読む 【C言語】ポインタのオーバーフローは未定義動作
【C言語】
printf(書式%s)にNULLが渡る時 “(null)”の表示を期待しないこと
■Windows系で許容されるがLinux系ではNG Windows系のコンパイラでは書式%sにNULLポインタが渡ると“(null)”と表示されるそうですが、Linux系(gcc,clang)で… 続きを読む 【C言語】
printf(書式%s)にNULLが渡る時 “(null)”の表示を期待しないこと
【C言語】
長い文字列は複数行に分けて書いてOK!円記号¥も不要
■長い文字列(寿限無) ■短い文字列を連結して長い文字列を作る ■予期せぬ文字列リテラルの連結(例1) C言語では連続する文字列リテラルは連結されます。つまり”文字列A” ”文字列B”は”文字列A… 続きを読む 【C言語】
長い文字列は複数行に分けて書いてOK!円記号¥も不要
【C言語】
無限ループの書き方
while(1)を避け
for(;;)を使う
■1.無限ループwhile(1)には亜種が多い(非推奨) while(1)から派生した色々な書き方があります。for(;;)の派生は、せいぜいセミコロンの空白くらいです。 ■2.while(1)に文句を言うツール対策(非… 続きを読む 【C言語】
無限ループの書き方
while(1)を避け
for(;;)を使う
【C言語】
memcmp(buf,”abc”,3 == 0)
閉じカッコの位置が違う
warning: size argument in ‘memcmp’ call is a comparison memcmpの第三引数が比較式[-Wmemsize-comparison] ■ 誤っ… 続きを読む 【C言語】
memcmp(buf,”abc”,3 == 0)
閉じカッコの位置が違う
【C言語】
文字列配列の要素数を指定すると終端文字’¥0’が入らず暴走する時がある
■1.暴走するstrlen ■2.暴走するprintf ■3.暴走するstrcmp ■4.暴走するstrcpy これらのプログラムが何と表示するかは動かしてみないと誰にもわかりません異常終了するかもしれません。 配列 a… 続きを読む 【C言語】
文字列配列の要素数を指定すると終端文字’¥0’が入らず暴走する時がある
【C言語】
論理演算子||に定数を使った!
if(x == ‘a’ || ‘A’){
warning: use of logical ‘||’ with constant operand 警告:論理演算子||に定数を使った[-Wconstant-logical-operand] ■… 続きを読む 【C言語】
論理演算子||に定数を使った!
if(x == ‘a’ || ‘A’){
【C言語】
不要なelseを削除しよう!
(No-else-return)
warning: do not use ‘else’ after ‘return’ 警告:return直後のelseは要らない[readability-else-after… 続きを読む 【C言語】
不要なelseを削除しよう!
(No-else-return)
【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言語】
do-while(0)を避ける理由
warning: redundant continue statement at the end of loop statement 警告:ループ文の末尾にある冗長なcontinue文[readability-redun… 続きを読む 【C言語】
do-while(0)を避ける理由
【C言語】ビットを
立てる x |= (1<<bit);
下げる x &= ~(1<<bit);
何もしない x |= (0<<bit);
■1.次のプログラムは何と表示されますか? ●解答 ■2.ビットの立て方 ■3.ビットの下げ方 ビット演算子チルダ~を使う ■4.何もしない x |= (0<<bit);でbitは立も下がりもしないのでデッド… 続きを読む 【C言語】ビットを
立てる x |= (1<<bit);
下げる x &= ~(1<<bit);
何もしない x |= (0<<bit);
【C言語】
#ifと#ifdefの違い
条件コンパイルの使い方
■1.#if DEBUG #define DEBUG 0#if DEBUGDEBUGの値は0#if 00は偽#if 偽⇒展開されない #define DEBUG 1#if DEBUGDEBUGの値は1#if 11は真… 続きを読む 【C言語】
#ifと#ifdefの違い
条件コンパイルの使い方
【C言語】
静的解析 対 動的解析
gcc -fanalyzer VS gcc -fsanitize
■1.-fanalyzer と -fsanitize gcc -Wall -Wextra -fanalyzer(静的解析) gcc -fsanitize=address(動的解析) ■2.動的解析で検出できる問題例 配列… 続きを読む 【C言語】
静的解析 対 動的解析
gcc -fanalyzer VS gcc -fsanitize
【C言語】
整数表現で int より狭いchar/short型を多用すると
符号拡張の事故にあう
warning: conversion to ‘size_t’ from ‘short’ may change the sign of the result 警告:shor… 続きを読む 【C言語】
整数表現で int より狭いchar/short型を多用すると
符号拡張の事故にあう
【C言語】
引き算の結果をゼロと比較するのは避けよう
warning: comparison of unsigned expression in ‘< 0’ is always false 警告:符号無しは負値にならない [-Wtype-limits] ■uint8_… 続きを読む 【C言語】
引き算の結果をゼロと比較するのは避けよう
【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言語】構造体を引数や戻り値にすると処理速度が遅くなるのでポインタを使おう
warning: function call has aggregate valuewarning: function returns an aggregate 警告:構造体を引数にした警告:構造体を返却した[-Wagg… 続きを読む 【C言語】構造体を引数や戻り値にすると処理速度が遅くなるのでポインタを使おう
【C言語】エラーを返すscanf関数の戻り値をチェックしよう(あれば便利程度strcpyの戻り値は無視してOK)
warning: ignoring return value of ‘scanf’ declared with attribute ‘warn_unused_result’ 警告:属性’warn_unused… 続きを読む 【C言語】エラーを返すscanf関数の戻り値をチェックしよう(あれば便利程度strcpyの戻り値は無視してOK)
【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言語】NULLは
【ヌル】ではなく
【ヌルポインタ】と発音しよう
warning: initialization of ‘char’ from ‘void *’ makes integer from pointer without a cast 警告: ‘void *’ で ‘char… 続きを読む 【C言語】NULLは
【ヌル】ではなく
【ヌルポインタ】と発音しよう
【C言語の演算子】
ビット演算子の優先順位は危険
if(x & 2 == 2)はバグ
warning: suggest parentheses around comparison in operand of ‘&’ 警告:&ビット演算子の回りにカッコつけよう[-Wparentheses] … 続きを読む 【C言語の演算子】
ビット演算子の優先順位は危険
if(x & 2 == 2)はバグ
【C言語】
未定義動作はコンパイラが出鱈目な動きをしてもプログラマは文句を言えない
warning: operation on ‘x’ may be undefined 警告: ‘x’ に対する演算は未定義動作の可能性があります。[-Wsequence-point] ■1.未定義… 続きを読む 【C言語】
未定義動作はコンパイラが出鱈目な動きをしてもプログラマは文句を言えない
【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言語】
enumは
符号付き(signed)か?
符号無し(unsigned)か?
warning: result of comparison of unsigned enum expression < 0 is always false 警告:unsigned enum 式 < 0 の比較… 続きを読む 【C言語】
enumは
符号付き(signed)か?
符号無し(unsigned)か?
【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言語】
32bit変数を 32bitシフトすると
0になる保証無し!
8bit変数を24bitシフトすると?
warning: left shift count >= width of type 警告:左シフト数 >= 型幅[-Wshift-count-overflow] ■シフトし過ぎ(定数で) オペランドのビット… 続きを読む 【C言語】
32bit変数を 32bitシフトすると
0になる保証無し!
8bit変数を24bitシフトすると?
【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言語】
memcmpで構造体比較すると穴に落ちる(padding)
warning: padding struct to align ‘i2’ 警告:i2′ を整列するため構造体に詰め物した[-Wpadded] ■1.境界調整のために穴が開く 構造体のメンバの割り付けはコンパ… 続きを読む 【C言語】
memcmpで構造体比較すると穴に落ちる(padding)
【C言語】
配列の添字の型は何が良い?
warning: the frame size of 40 bytes is larger than 0 bytes 警告:スタックフレームサイズは0byte以上の40byte[-Wframe-larger-than=0… 続きを読む 【C言語】
配列の添字の型は何が良い?
【C言語】
メモリ破壊
Out of bounds,
Off-by-one Error
warning: array subscript 10 is outside array bounds of ‘char[10]’ 警告:配列の添え字 10 は ‘char[10]’ の配列境界外… 続きを読む 【C言語】
メモリ破壊
Out of bounds,
Off-by-one Error
【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言語】
局所変数のループカウンタにloop_counterと長い名前を付けるのは止めよう
■1.長い名前は本当に分かりやすいですか? ↑↓これは間違いだ! 【保守の事を考えると”変数名”に意味のない名前を与えると後でわからなくなる。多少面倒でも後で見て何を意味している変数なのかわかるよ… 続きを読む 【C言語】
局所変数のループカウンタにloop_counterと長い名前を付けるのは止めよう
【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言語】
NULLポインタ参照
(NULL Pointer Dereference)
warning: dereference of NULL 警告:NULL ポインタの関節参照[-Wanalyzer-null-dereference] ■1.未初期化ポインタ参照 ptr を 初期化していません。これはメ… 続きを読む 【C言語】
NULLポインタ参照
(NULL Pointer Dereference)
【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(浮動小数点)