技術紹介

ソフトウェアシステムの品質向上を目的とした取り組みの紹介－コーディング規約と静的解析の適用について－髙野武寿 *1

Takano Takehisa

久山岳 *2

Hisayama Takeshi

制御、計測関連のソフトウェア開発業務において、実装フェイズのミス撲滅を最重点項目として、品質の向上に取り組んでいる。プログラム記述の決まりごとを規定したコーディング規約を設定し、これに従った実装を徹底するとともに、静的解析ツールを用いた解析の実施により、規約の遵守状況を審査することとした。本取り組みをモデル案件に試験導入し、一定の成果を得たことから、部門内に順次展開していく。
キーワード：実装品質、コーディング規約、静的解析

装（製造）、検査という概念は共通であるが、ソ

1. はじめにフトウェアシステムには、実装（製造）において当部門では、ソフトウェア開発を業務所掌とし以下に述べる特有の事情があり、品質の担保が難ており、その中でも制御・計測分野を主要なターしい分野と言える。

ゲットとしている。

機械、建設等の世界では、設計書、製作要領書

これらの分野のソフトウェアシステムは、制御等があれば、製作者が異なっても基本的には同等装置や計測装置といったハードウェアと連携してのものができあがる。このため検査の項目は、設機能するため、品質の維持・向上のためには、こ計通りの物品が製造されていることを、設計値、の分野に特有な取り組みが必要となる。

性能値に着目して設定することになる。

本稿では、当部門におけるソフトウェアの品質

しかしソフトウェアの世界では、上記の考え方向上のための取り組みについて紹介する。

はそのまま適用できない。
プログラマが各自の知見、スキルに従いプログ

2. 品質向上への取り組みの背景

ラムを記述するため、同一の設計に対し、プログ

2.1 ソフトウェア品質に関する課題

ラマが異なれば百人百様のプログラムができ得

ソフトウェアシステムの開発工程は一般的に、設る。ソフトウェア開発が、工業より料理や音楽に計フェイズ、実装フェイズ、検査フェイズからなる。

例えられる所以である。このため、外部から見た電気、機械、建設といった分野でも、設計、実ソフトウェアの振る舞いだけでは、内部の構造の*1：制御システム事業部*2：制御システム事業部

コンピュータ制御部
コンピュータ制御部

ゆえん次長

—66—

良否まで検証することは困難で、品質の担保が難しい世界であると言える。
ソフトウェアシステムでの開発プロセスは、設計を複数のレベルに分割し、各レベルに対応した検査を実施することで、品質を管理する手法が広く一般に用いられている。
このプロセスにおいて、設計フェイズは、シス
テム要求分析、システム方式設計、ソフトウェア要求分析、ソフトウェア方式設計、ソフトウェア

図 1 ソフトウェアシステム開発の V 字モデル

詳細設計という段階に分かれる。各段階で、要求から設計へと詳細化していくことで、開発するソ

2.2 ソフトウェアシステム開発業務の特徴

フトウェアの仕様を細目に渡って明確化してゆく。これにより、実装フェイズでの誤認を招くよ

当部門では、制御、計測関連のソフトウェア開うな曖昧さを、極力減らしていこうという考え方

発を、主たる事業対象としている。

である。

制御の分野では、電気装置・機械装置が取り扱

実装フェイズでは、詳細設計にて明確に示されい対象である。また計測の分野では、各種の物理た事項に従い、プログラムを記述（実装）してい事象を数値化するための、センサ類が取り扱い対く。

象となる。

検査フェイズでは、単体テスト、ソフトウェアともに、ハードウェアを直接取り扱う必要が生

結合テスト、ソフトウェア総合テスト、システムじることから、それに適したプログラミング言語

結合テスト、システムテストという段階で、ソフである C 言語と、その拡張形である C++ を使用

トウェアの部分ごとからシステム全体へと、微視することが多い。これらの言語は、プログラム記的な項目から巨視的な項目へと視点を変えて検査述の自由度が高いことから、プログラミングミスを行う。設計フェイズを逆にたどり、設計で示さにより思わぬ誤動作を生じかねないという面も有れた事項が漏れなく実現されていることを確認すしている。

るという考え方である。

また、開発したソフトウェアシステム単独での設計から実装、実装から検査という流れは、実動作とはならないことから、ハードウェアとのイ装を最下端とした V 字型の概念図として示されンターフェース部において、ハードウェアの動作ることから、ソフトウェアシステム開発の V 字状況との相関により想定外の挙動となって、不具モデル（図 1）と呼ばれる。

合事象が現れることがある。

ここで留意すべきは、検査により検証されるのこれらの問題は、設計フェイズよりも実装フェは、ソフトウェアの内部的な構造や動作ではなく、イズのミスに起因することが多い。このため、製外から見てわかる振舞いであるという点である。

品品質の向上を目的として、実装フェイズのミスこのため、内部構造に由来する潜在的不具合をい防止を特に重要視している。

かに見逃さず、検査により品質を担保するかが課題となる。
—67—

IIC REVIEW/2016/04. No.55

宣言方法を正しく選択しないと、誤動作を生じる

3. 実装品質向上の取り組み

場合がある。また、変数を正しく初期化しなかっ当部門でも、ソフトウェアシステム開発分野のたことで値が不定となることや、誤った初期化操例に漏れず、V 字モデルによる開発プロセスを採作により変数の内容を破壊してしまい、当該変数用しているが、前述の事情により実装フェイズのを用いた以後の演算処理の結果が、不正な値となミス撲滅を、最重点項目として挙げている。

る場合がある。

このため、以下の取り組みを行っているので紹

コーディング規約では、これらの問題を防止す介する。

るために、変数の宣言や初期化に関わる実装方法のルールを定めた。

3.1 コーディング規約の制定（3）データ型に関する規約

前述のようにソフトウェアの記述では、プログ

本項目は、主にソフトウェア内の変数のデータラマが異なれば百人百様となる面がある。そのよ型の取り扱いを規定するものである。

うなばらつきを抑制するために設定するのが、プ

変数には、整数型や実数型、符号の有無、取りログラム記述の決まりごとを規定したコーディン

扱い可能な数値の範囲（データ長）の大小により、グ規約である。

複数の種別がある。異なるデータ型同士で演算や当部門では、ソフトウェアの品質低下に結び付代入を行った場合に、演算結果に思わぬ副作用がき得る事項を、以下のように分類したうえで、各生じる場合がある。

分類についてのコーディング規約を設定した。

コーディング規約では、異種のデータ型間での各規約は、陥りやすい不適合の例と、本来ある演算・代入にあたって、注意すべき事項を示しルーべき適切な記述とを併記することで、読み手が自ル化した。規約の例を、図 2 に示す。

身の記述したプログラムの良し悪しを判断できる（4）演算子／演算式に関する規約体裁とした。

ソフトウェア内での数値演算には、四則演算以外（1）文（ステートメント）に関する規約に、論理演算・ビット演算という概念も加わる。各

ソフトウェアにおける文（ステートメント）と演算の種別間で、優先順位が定められているが、そは、プログラムを構成する要素で、処理の手続きの誤認により演算処理にミスを生じる場合がある。

を表すものである。分岐処理、反復処理などの実コーディング規約では、演算ミスの生じにくい行文があり、これらを用いてプログラムの処理の演算式の記述方法や、第三者が読んだ時に意図を流れを記述する。各処理の条件判定等の記述を誤解しにくい記述方法を示した。規約の例を、図誤った場合、処理の流れが適切に実行されない。

3 に示す。
（5）配列／ポインタに関する規約

コーディング規約では、文を取り扱う際に誤りやすい記述と、適切な記述とを示した。

C 言語系の開発言語において、習得時に最も理（2）宣言／初期化に関する規約解の難しい概念が、ポインタである。

本項目は、主にソフトウェア内の変数の定義方

ポインタとは、ソフトウェアをメモリ空間上に法を規定するものである。

配置した場合の、メモリ上の位置（番地＝アドレ

変数には、ソフトウェア内のメモリ配置の違いス）を示すものである。主に、関数に対し数値をなどにより複数の宣言方法がある。目的にあった参照渡しする場合に用いる。特に経験年数の少な—68—

いプログラマが、変数の内容値とポインタ値（配データ、内部の処理などを定義すると、以後は関置のアドレス）とを取り違えるといったミスを生数の名称を呼び出せば、内部の処理を繰り返し実じやすいが、ポインタ値に対する演算処理など複行することができる。

雑な取り扱いをした場合には、ベテランであって入力データと出力データには、それぞれデータも実装ミスをする可能性がある。

型の種別やポインタの取り扱いが関連する。このため、関数を取り扱う場合には、前述の（3）、（5）

また、複数の変数の集合を取り扱うデータ構造である配列においても、ポインタの理解が必要でと同様の注意が必要である。

あり、同様な実装ミスを生じる場合がある。

このため、コーディング規約において、関数をこのため、コーディング規約では、メモリ上のデー定義する際の記述方法について、呼び出しミスをタ配置や、ポインタの取り扱いに関する規約を制生じにくい例を示した。

定しミスの防止策とした。規約の例を、
図 4 に示す。

（7）可読性に関するもの（6）関数定義に関する規約

ソフトウェアは、開発完了後の保守性に配慮し、ソフトウェアにおける関数とは、繰返し利用す読みやすい記述とする必要がある。

る一連の処理を、1 つにまとめたものである。関コーディング規約では、ソフトウェアの記述の数の名称、入力として与えるデータ、出力される意図や目的を、第三者が正しく理解できるよう、

図2

データ型に関するコーディング規約の例

図3

演算子に関するコーディング規約の例—

69—

IIC REVIEW/2016/04. No.55

図4

ポインタに関するコーディング規約の例

コメント等の説明文を適切に記述するためのルー象であるソフトウェアのプログラム記述が、あらルを定めた。

かじめ定めた解析ルールに合致していることを判定するものである。

3.2 静的解析による規約の遵守状況の審査

コーディング規約の遵守状況を審査することを前節において、当部門で実装担当者に展開した目的として、市販の静的解析ツールを導入した。導コーディング規約を紹介した。

入にあたっては、さまざまな市販ツールの中から、しかしながら、当部門の人員規模において（数解析ルールの定義の自由度が高い製品を選定した。

十人、派遣社員を含む）、実装に当たっての決ま

同製品の導入後に、以下の手順により解析ルーりごとを示すのみでは、実装品質を担保する手段

ルのチューニングを実施した。

としては不十分であり、決まりごとの遵守を担保（1）当部門で制定したコーディング規約の全項するための仕組みが必要と考えた。このため、静目を、解析ツール内で使用可能な設定の形式的解析の実施により規約の遵守状況を審査するこに落とし込み、解析ルール化した。ととした。

（2）コーディング規約に意図的に違反したプロ

静的解析とは、ソフトウェアの記述内容（ソーグラムを作成し、解析ツールにより漏れなくスコード）について検証を行う手法である。ソフ検知できることを確認した。

トウェアを実行しながら内部状況の解析を行う動（3）過剰検知や検知漏れが発生した解析ルール的解析と、対を成すものである。動的解析が、ソについて、設定の見直しを行い適切な解析結フトウェアを実際に動作させ、その振る舞いを解果が得られるよう調整した。

析するのに対し、静的解析では記述内容の良否自この結果、単に市販のツールを用いるに留まら体を解析する点が異なる。静的解析は、専用の解ず、当部門のノウハウを注入したオリジナルの解析ツールにより実施することが一般的で、解析対析ルールを得ることができた。

—70—

3.3 コーディング規約および静的解析ツールの

5. 結言

展開状況
前述のとおり、コーディング規約をルール化し当部門において注力しているソフトウェアの品た静的解析ツールは、現在、モデル案件を設定し質向上の取り組みにおいて、実装の品質に着目し、試験導入している段階である。

コーディング規約を制定するとともに、その適用その過程で、潜在不具合となりうる不適切な実状況を担保するために静的解析ツールを導入し装が実際に発見されており、一定の成果を得ていた。試験導入により一定の成果を得たことから、る。今後、試験導入に関わったメンバーを中心に、今後は部門内に順次展開していく。

部門内に順次展開していく。
4. 今後の課題
C 言語および C++ については、前述の取り組みを順次展開する予定であるが、近年、ソフトウェアシステムの適用分野が拡大されるにつれ、開発環境と開発言語が多様化してきている。必ずしも、これまで主流であった C 言語や C++ のみを対象とした取り組みでは十分と言えなくなってきた。
このため今後は、.Net Framework や Java といった開発言語についても、同様の取り組みを進める予定である。
各言語について特有の規約が必要となり、言語ごとに解析ツールも異なるので、それぞれについてノウハウを蓄積していく。

制御システム事業部
コンピュータ制御部
次長

制御システム事業部
コンピュータ制御部

久山

髙野 武寿

岳

TEL. 042-523-8315
FAX. 042-523-8320

TEL. 042-523-8315
FAX. 042-523-8320
—

71

—

IIC REVIEW/2016/04. No.55