C言語 デバッグ完全解説

[表紙]C言語 デバッグ完全解説

B5変形判/376ページ

定価(本体2,780円+税)

ISBN 978-4-7741-3362-1

ただいま弊社在庫はございません。

→学校・法人一括購入ご検討の皆様へ

書籍の概要

この本の概要

なぜバグは無くならないのでしょうか? 本書はC言語プログラムでバグが生まれるメカニズム,またその対処方法,さらにはバグを予防する方法までを解説しています。本書を読めば,バグの発生を少なくする方法が理解できるでしょう。

こんな方におすすめ

  • C言語プログラムのバグで悩んでいる人

本書のサンプル

本書の一部ページを,PDFで確認することができます。

本書の紙面イメージは次のとおりです。画像をクリックすることで拡大して確認することができます。

サンプル画像1

サンプル画像2

目次

  • はじめに
  • 最初に

第1章 最初に

  • 1.1 コンピュータとバグ
  • 1.2 本書の目標
  • 1.3 方針と考え方
  • 1.4 バグのタイプ
  • 1.5 本書で扱うバグ
  • 1.6 C言語の標準規格

第2章 初級コース―単純なバグ

  • 2.1 タイプミス
    • 2.1.1 演算子の書き間違い
    • 2.1.2 数字の書き間違い
    • 2.1.3 コンマ忘れ
    • 2.1.4 気付かないラベル
    • 2.1.5 コピー&ペースト
    • 2.1.6 定数名の間違い
    • 2.1.7 break忘れ
    • 2.1.8 コメントの誤り
  • 2.2 変数の使い方
    • 2.2.1 整数型と実数型
    • 2.2.2 配列のインデックス
  • 2.3 演算子の優先順位
    • 2.3.1 フラグの操作
    • 2.3.2 優先順位の誤解
    • 2.3.3 条件式の中での代入
  • 2.4 マクロ
  • 2.5 ブロック
    • 2.5.1 変数名の重複
    • 2.5.2 breakの飛び先
    • 2.5.3 ぶら下がりelse問題
    • 2.5.4 中カッコの不足
  • 2.6 初級コースのまとめ
  • 2.7 中級コースの前に.基本事項の整理
    • 2.7.1 整数の表現と性質
    • 2.7.2 実数の表現と性質
  • コラム バグの語源

第3章 中級コース―よくあるバグ

  • 3.1 整数型にまつわるバグ
    • 3.1.1 オーバーフロー
    • 3.1.2 負の値
    • 3.1.3 ビット演算
    • 3.1.4 シフト演算
    • 3.1.5 符号拡張
    • 3.1.6 式の評価順序
    • 3.1.7 整数同士の除算
    • 3.1.8 ゼロ除算
    • 3.1.9 剰余算
    • 3.1.10 ゼロの区別
  • コラム 符号付きの加減算命令はない?
  • 3.2 実数型にまつわるバグ
    • 3.2.1 浮動小数点数の加減算
    • 3.2.2 ループでの使用
    • 3.2.3 浮動小数点数の比較
    • 3.2.4 予期しない値
    • 3.2.5 オーバーフローとアンダーフロー
  • 3.3 暗黙の型変換
    • 3.3.1 算術変換
    • 3.3.2 符号の有無
    • 3.3.3 汎整数拡張(整数への格上げ)
    • 3.3.4 関数の引数の格上げ
  • 3.4 配列にまつわるバグ
    • 3.4.1 配列へのアクセス
    • 3.4.2 不正なインデックス
    • 3.4.3 不正メモリアクセス
    • 3.4.4 動的な配列の作成
    • 3.4.5 文字列の扱い
  • 3.5 要注意な標準ライブラリ関数
    • 3.5.1 ファイル入出力
    • 3.5.2 文字列処理
    • 3.5.3 時刻
    • 3.5.4 数学関数
    • 3.5.5 乱数
  • 3.6 中級コースのまとめ
  • 3.7 上級コースの前に.メモリの整理
    • 3.7.1 関数への引数の受渡し
    • 3.7.2 変数のスコープ
    • 3.7.3 メモリ領域
    • 3.7.4 ポインタ
  • コラム CPUのバグ

第4章 上級コース―再現しないバグ

  • 4.1 変数の実体
    • 4.1.1 変数のメモリ領域
    • 4.1.2 定数のメモリ領域
    • 4.1.3 宣言と定義
    • 4.1.4 関数への配列の受渡し
    • 4.1.5 エンディアン
    • 4.1.6 構造体のパディング
  • 4.2 動的メモリ確保
    • 4.2.1 メモリ管理
    • 4.2.2 初期化忘れ
    • 4.2.3 初期化もれ
    • 4.2.4 初期化の必要性
    • 4.2.5 領域不足
    • 4.2.6 バッファオーバーラン
    • 4.2.7 二重解放
    • 4.2.8 解放済み領域参照
    • 4.2.9 メモリ破壊
    • 4.2.10 メモリリークとメモリ枯渇
    • 4.2.11 メモリリーク関連のバグを検出させる
  • 4.3 ポインタにまつわるバグ
    • 4.3.1 NULL ポインタについて
    • 4.3.2 余計なキャスト
    • 4.3.3 不正メモリアクセスとポインタ演算
    • 4.3.4 配列とポインタの違い
  • 4.4 スタック領域
    • 4.4.1 スタック破壊
  • 4.5 関数呼出し
    • 4.5.1 自動変数では戻せない
    • 4.5.2 引数の評価順序
    • 4.5.3 関数へのポインタ
  • 4.6 割込み処理
    • 4.6.1 シグナル
    • 4.6.2 静的変数の書換え
    • 4.6.3 同期と排他
    • 4.6.4 リンクリストの操作
    • 4.6.5 スタックと割込み
    • 4.6.6 関数の再入
    • 4.6.7 シグナル処理の書き方
    • 4.6.8 volatile キーワード
    • 4.6.9 再入を防ぐには
    • 4.6.10 複数箇所での受信
  • 4.7 ビルドの過程
    • 4.7.1 ツールにチェックさせる
    • 4.7.2 コンパイルされているか
    • 4.7.3 リンカの処理
    • 4.7.4 コンパイルオプション
    • 4.7.5 重複シンボル
  • 4.8 仕様書のバグ
  • 4.9 レビューで見るべきもの
  • 4.10 さらに上級を目指すために

第5章 デバッグ

  • 5.1 デバッグ作業
    • 5.1.1 デバッグのあらまし
    • 5.1.2 移植でもデバッグは必要
  • 5.2 デバッグのためのコーディング
    • 5.2.1 プリプロセッサの利用
    • 5.2.2 ログの出力
    • 5.2.3 関数単位に分割する
    • 5.2.4 インターフェースは安全に
    • 5.2.5 関数ラッパ
    • 5.2.6 パラメータをまとめる
    • 5.2.7 未コーディング部分の対処
  • 5.3 テスト
    • 5.3.1 テストの効率
    • 5.3.2 テストの意味
    • 5.3.3 チェックは多面的に
    • 5.3.4 バグの検出
    • 5.3.5 境界に気をつける
    • 5.3.6 単純なコードと結果を比較する
    • 5.3.7 パラメータ値を変更してみる
    • 5.3.8 異常系のテスト
    • 5.3.9 異常系のテストで確認するもの
    • 5.3.10 ランダムな入力を与える
    • 5.3.11 状態遷移を網羅する
    • 5.3.12 マトリクスを作成する
    • 5.3.13 メモリ枯渇のテスト
    • 5.3.14 長時間テスト・高負荷テスト
    • 5.3.15 タイミング依存のバグ
    • 5.3.16 記録をつける
    • 5.3.17 仕様書に沿ったテストを
    • 5.3.18 枯れたツールを利用する
  • 5.4 調査
    • 5.4.1 再現性
    • 5.4.2 切分け
    • 5.4.3 余計な条件を省く
    • 5.4.4 トラップを仕掛ける
    • 5.4.5 発生しやすくする
    • 5.4.6 履歴を遡る
    • 5.4.7 デバッガの利用
  • 5.5 対策の検討・修正・確認
    • 5.5.1 別のバグをつくらないように
    • 5.5.2 対処漏れを防ぐ
    • 5.5.3 修正は本当に必要か
  • 第6章 バグの予防

  • 6.1 なぜバグを出してはいけないのか
    • 6.1.1 プログラミング言語の役割
    • 6.1.2 プログラミングは共同作業
    • 6.1.3 修正時にもバグは入る
    • 6.1.4 バグで悩まないために
    • 6.1.5 作業の標準化
  • 6.2 「プログラミングをしない」ために
    • 6.2.1 書かないことを考えてみる
    • 6.2.2 流用・移植
    • 6.2.3 ライブラリを利用する
    • 6.2.4 定数は書かない
    • 6.2.5 同じことを二ヶ所に書かない
    • 6.2.6 入口と出口
    • 6.2.7 修正量を減らす
    • 6.2.8 チェックをしなくて済むように
  • 6.3 「かもしれないプログラミング」のために
    • 6.3.1 明確に規定されていない動作
    • 6.3.2 C 言語は移植性がない
    • 6.3.3 移植性を確保する
    • 6.3.4 修正に備える
    • 6.3.5 本当に備えておくべきか考える
    • 6.3.6 論理に忠実に
    • 6.3.7 安全に書く・無難に書く
    • 6.3.8 将来的な変更を考える
  • 6.4 「伝えるプログラミング」のために
    • 6.4.1 読みやすく書く
    • 6.4.2 流れをわかりやすく
    • 6.4.3 使いどころを考える
    • 6.4.4 単純に書く
    • 6.4.5 イリーガルな書き方はしない
    • 6.4.6 名前を適切につける
    • 6.4.7 名前は規則的に
    • 6.4.8 コメントに頼らない
    • 6.4.9 コメントを入れる
    • 6.4.10 最適化はしない
    • 6.4.11 単位の標準化
    • 6.4.12 インターフェースは明確に
  • 6.5 楽をするために
    • 6.5.1 設計が7割
    • 6.5.2 自分は今,何を作ろうとしているのか
    • 6.5.3 様々な書き方を知る
    • 6.5.4 時間があるときには
    • 6.5.5 他人に説明する
    • 6.5.6 教育

第7章 最後に

  • 7.1 そもそもプログラムとは何か
  • 7.2 コンピュータの限界
  • 7.3 バグの原則
  • 7.4 プログラミング技術=伝える技術
  • プログラミングのチェックポイント

著者プロフィール

坂井丈泰(さかいたけやす)

1994年 早稲田大学理工学部電気工学科卒業/1996年 同大学院理工学研究科電気工学専攻修士課程修了/1996~ 運輸省電子航法研究所(現在は独立行政法人に改組)に勤務。

以来,航空用衛星航法システム(GPS)の研究に従事.学生時代のアルバイトで多数の計測制御機器のプログラムを作成した経験を生かし,鋭意研究活動中.情報処理技術者試験は,アプリケーションエンジニア,ソフトウェア開発技術者,テクニカルエンジニア(全区分),上級システムアドミニストレータ他を取得。著書「GPS技術入門」「GPSのための実用プログラミング」(いずれも東京電機大学出版局)。東京海洋大学客員准教授.博士(工学)。


坂井弘亮(さかいひろあき)

1997年 東京理科大学工学部電気工学科卒業/1999年 同大学院工学研究科電気工学専攻修士課程修了/1999~ 株式会社PFU勤務.ネットワーク製品のハードウエア・ソフトウエア開発に従事。

現在,富士通株式会社に勤務.ネットワーク製品の開発業務に携わるかたわら,PC-UNIXハッキング,雑誌記事の執筆,FPGA設計,独自OSの作成(ホームページ上で公開中)などで活動中.著書「C言語 入門書の次に読む本」 (技術評論社)。論理言語,組み込みシステム,FPGA,組み込みOS等に興味がある。