Code Quality コードリーディングによる非機能特性の識別技法
Code Quality ~コードリーディングによる非機能特性の識別技法~ (プレミアムブックス版)
毎日コミュニケーションズ
著者:Diomidis Spinellis
訳者:(株)トップスタジオ
監訳:鵜飼文敏、後藤正徳、平林俊一、まつもとゆきひろ
序文
日本語版に寄せて
はじめに
まえがき
第1章 序論
1.1 ソフトウェアの品質
1.1.1 ユーザー、作成者、管理者の側から見た品質
1.1.2 品質属性
1.1.3 特性どうしの衝突
1.2 本書の読み方
1.2.1 表現上の規則
1.2.2 ダイアグラム
1.2.3 グラフ
1.2.4 アセンブリコード
1.2.5 練習問題
1.2.6 副教材
1.2.7 ツール
第2章 信頼性
2.1 入力の問題
2.2 出力の問題
2.2.1 不完全な出力
2.2.2 正しい結果を得る上で考慮すべきタイミングの問題
2.2.3 フォーマットの間違い
2.3 ロジックの問題
2.3.1 1つ違い(offb‐y―one)エラーとループ反復
2.3.2 極限状態の確認不履行
2.3.3 ケース、条件テスト、手順の見落とし
2.3.4 メソッドの見落とし
2.3.5 不要な機能
2.3.6 誤解
2.4 算法の問題
2.4.1 正しくないアルゴリズムと算法
2.4.2 式の不適切なオペランド
2.4.3 式の不正な演算子
2.4.4 演算子の優先順位の問題
2.4.5 オーバーフロー、アンダーフロー、符号変換エラー
2.5 並列性とタイミングの問題
2.6 インターフェイスの問題
2.6.1 間違ったルーチンまたは引数
2.6.2 戻り値テストの不履行
2.6.3 エラー検出/エラー回復の見落とし
2.6.4 リソースリーク
2.6.5 オブジェクト指向機能の濫用
2.7 データ操作の問題
2.7.1 不正なデータ初期化
2.7.2 不正なデータ変数の参照
2.7.3 境界外参照
2.7.4 不正な添え字付け
2.7.5 位取りやデータ単位の不正
2.7.6 不正なパック/アンパック操作
2.7.7 矛盾するデータ
2.8 障害許容性
2.8.1 管理戦略
2.8.2 空間的な冗長化
2.8.3 時間的な冗長化
2.8.4 回復性
第3章 セキュリティ
3.1 脆弱なコード
3.2 バッファオーバーフロー
3.3 競合状態
3.4 問題のあるAPI
3.4.1 バッファォーバーフローを起こしやすい関数
3.4.2 書式文字列の脆弱性
3.4.3 パスとシェルのメタ文字の脆弱性
3.4.4 一時ファイル
3.4.5 暗号用には適さない関数
3.4.6 偽造可能なデータ
3.5 信頼できない入力
3.6 結果の検証
3.7 データと権限の漏洩
3.7.1 データ漏洩
3.7.2 権限漏洩
3.7.3 Javaアプローチ
3.7.4 特権的なコードの分離
3.8 トロイの木馬
3.9 ツール
第4章 タイムパフォーマンス
4.1 測定手法
4.1.1 作業負荷の特徴付け
4.1.2 I/Oバウンドタスク
4.1.3 カーネルバウンドタスク
4.1.4 CPUバウンドタスクとプロファイルツール
4.2 アルゴリズムの複雑さ
4.3 スタンドアロンコード
4.4 オペレーティングシステムとのインタラクション
4.5 周辺機器とのインタラクション
4.6 不本意なインタラクション
4.7 キャッシュ
4.7.1 簡単なシステムコールキャッシュ
4.7.2 置き換えによる方法
4.7.3 結果の事前計算
第5章 空間パフォーマンス
5.1 データ
5.1.1 基本データ型
5.1.2 集約データ型
5.1.3 アライメント
5.1.4 オブジェクト
5.2 メモリ構成
5.3 メモリの階層構造
5.3.1 メインメモリとキャッシュ
5.3.2 ディスクキャッシュとバンクメモリ
5.3.3 スワップ領域とファイルベースのディスクストレージ
5.4 プロセスとオペレーティングシステムのインターフェイス
5.4.1 メモリ割り当て
5.4.2 メモリマッピング
5.4.3 データマッピング
5.4.4 コードマッピング
5.4.5 ハードウェアリツースヘのアクセス
5.4.6 プロセス間通信
5.5 ヒープメモリの管理
5.5.1 ヒープの断片化
5.5.2 ヒーププロファイリング
5.5.3 メモリリーク
5.5.4 ガーベジコレクション
5.6 スタックメモリの管理
5.6.1 スタックフレーム
5.6.2 スタック空間
5.7 コード
5.7.1 設計時
5.7.2 コーディング時
5.7.3 ビルド時
第6章 移植性
6.1 オペレーティングシステム
6.2 ハードウェアおよびプロセッサアーキテクチャ
6.2.1 データ型プロパティ
6.2.2 データ言己憶域
6.2.3 マシン固有のコード
6.3 コンパイラと言語のエクステンション
6.3.1 コンパイラのバグ
6.4 グラフィカルユーザーインターフェイス
6.5 国際化と地域化
6.5.1 文字集合
6.5.2 ロケール
6.5.3 メッセージ
第7章 保守性
7.1 保守性の定量化
7.1.1 保守性の指標
7.1.2 オブジェクト指向プログラムのメトリック
7.1.3 パッケージ間の依存性メトリック
7.2 解析性
7.2.1 一貫性
7.2.2 式のフォーマット
7.2.3 ステートメントのフォーマット
7.2.4 命名の規約
7.2.5 ステートメントレベルのコメント
7.2.6 バージョン管理用のコメント
7.2.7 仮想的な構造:ブロックおよびインデント
7.2.8 式、関数、メソッドの長さ
7.2.9 制御構造
7.2.10 ブール式
7.2.11 コードの認識性と凝集度
7.2.12 依存関係と結合
7.2.13 コードブロックのコメント
7.2.14 データ宣言のコメント
7.2.15 識別子の適切な命名法
7.2.16 依存関係の局所性
7.2.17 曖味性
7.2.18 検査性
7.3 変更性
7.3.1 コードの特定
7.3.2 コードの分離
7.4 安定性
7.4.1 カプセル化およびデータ隠蔽
7.4.2 データの抽象化
7.4.3 型チェック
7.4.4 コンパイル時アサーション
7.4.5 実行時チェックおよび検査時アサーション
7.5 試験性
7.5.1 ユニットテスト
7.5.2 統合テスト
7.5.3 システムテスト
7.5.4 テストカバレッジ解析
7.5.5 インシデンタルテスト
7.6 開発環境のもたらす影響
7.6.1 インクリメンタルビルド
7.6.2 ビルドのパフォーマンスの改善
第8章 浮動小数点演算
8.1 浮動小数点表現
8.1.1 測定誤差
8.1.2 丸め
8.1.3 メモリフォーマット
8.1.4 正規化と暗黙の1ビット
8.1.5 指数のパイアス
8.1.6 負の数
8.1.7 非正規化数
8.1.8 特殊な値
8.2 丸め
8.3 オーバーフロー
8.4 アンダーフロー
8.5 桁落ち
8.6 吸収
8.7 無効な演算
付録A ソースコードの著作者
参考文献
索引
題辞
あとがき
著者紹介/監訳者紹介