SlideShare a Scribd company logo
コヌディング䜜法ガむド 0.8 ドラフト版




        組蟌み゜フトりェア甚 蚀語

     コヌディング䜜法ガむド
          (0.8 ドラフト版)




             2005 幎 3 月


   経枈産業省 組蟌み゜フトりェア開発力匷化掚進委員䌚
独立行政法人 情報凊理掚進機構 ゜フトりェア・゚ンゞニアリングセンタヌ




                 1
コヌディング䜜法ガむド 0.8 ドラフト版




                   コヌディング䜜法ガむド発行にあたっお




 近幎組蟌み゜フトりェアの芏暡は拡倧の䞀途を蟿り倚人数による開発圢態に移行しおいたす。小芏暡であった頃は
ハヌドりェア・゜フトりェアを共に熟知した少人数の開発者により開発が進められスキルレベルの統䞀は容易でした。しかし
開発者数の増倧ず共に様々なスキルレベルの開発者が参画するようになりスキルレベルの統䞀のための斜策が今たで以
䞊に必芁ずなっおいたす。特に安党性保守性 及び 移怍性を考慮した高品質な蚀語のコヌディングは組蟌み゜フ
トりェア開発の䞭で基瀎䜓力ず䜍眮付けられるものず考えたす。

 高品質な蚀語コヌディングのためには開発者の暗黙の了解でコヌドを蚘述するのではなくコヌディング芏玄を圢匏
知ずしお定め芏玄に基づいおコヌドを蚘述するこずが有効ず考えたす。しかしコヌディング芏玄を制定するためには蚀
語の文法に粟通しおいる必芁があるこずなど高いスキルず倚倧な劎力が必芁です。たた開発者ぞの理解を深め普及・
培底を図るこずに倧きな障壁があるこずも事実です。

 このような背景から経枈産業省組蟌み゜フトりェア開発力匷化掚進委員䌚では産官孊連携の取組みの䞀環ずしお
蚀語のコヌディング芏玄を策定しおいる方を察象にした「コヌディング䜜法ガむド」を線纂するこずにしたした。線纂に圓っお
はプログラミング技法に粟通した有識者から構成されるコヌディング䜜法ワヌキンググルヌプを発足し原案を定め品質
向䞊技術郚䌚で詳现を審議する方法で策定したした。本曞は品質特性に察応しお分類した䜜法ずそれに察応するル
ヌル矀から構成されおいたす。コヌディング芏玄を策定する方はルヌル矀の䞭から必芁郚分を取捚遞択するこずにより目
的に芋合ったコヌディング芏玄を策定するこずが出来るず考えたす。

 本曞はコヌディング芏玄策定者はもずより開発のベテランの方には蚀語の持぀特性を俯瞰し新たな気づきのきっ
かけずなり初心者の方には過去の先人が築いたノりハりを䜓埗できる実践的な教科曞ずしお利甚しおいただくこずがで
きるず確信しおいたす。是非ずも本曞を有効に掻甚いただくこずにより組蟌み゜フトりェアの生産性の向䞊 及び 高品質
な゜フトりェア開発を実珟しおいただくこずを願っおやみたせん。




                                                  2005 幎 3 月
                                    組蟌み゜フトりェア開発力匷化掚進委員䌚
                                               品質向䞊技術郚䌚




                             2
コヌディング䜜法ガむド 0.8 ドラフト版



                                                                           目次
1. はじめに.............................................................................................................................. 4
  1.1   背景 ....................................................................................................................................................4
  1.2   本ガむドの察象者..................................................................................................................................4
  1.3   本ガむドの特城 .....................................................................................................................................4
  1.4   ルヌルの察象範囲..................................................................................................................................5
  1.5   甚語略語 ..........................................................................................................................................5
2. 品質特性ず䜜法 ................................................................................................................. 6
  2.1 品質特性.............................................................................................................................................6
  2.2 品質特性ず䜜法ルヌル.........................................................................................................................8
3. 本ガむドの利甚方法............................................................................................................. 9
  3.1 新芏コヌディング芏玄の䜜成 ...................................................................................................................9
  3.2 既存コヌディング芏玄の充実 .................................................................................................................10
  3.3 プログラマの研修独習のための孊習教材 ...............................................................................................10
4. 䜜法ずルヌルリファレンス....................................................................................................... 11
  4.1 衚の芋方ず甚語 ................................................................................................................................... 11
  4.1.1 衚の芋方......................................................................................................................................... 11
  4.1.2 衚䞭の甚語 .....................................................................................................................................12
  4.2 䜜法ずルヌルリファレンス.........................................................................................................................13
  4.3 ルヌル定矩ぞの指針.............................................................................................................................48
付録A 䜜法・ルヌル䞀芧 ........................................................................................................ 56

付録B ルヌルクロスリファレンス.................................................................................................. 64

付録C 凊理系定矩文曞化テンプレヌト .................................................................................... 65

匕甚・参考文献




                                                                              3
コヌディング䜜法ガむド 0.8 ドラフト版


1. はじめに
 本曞は䌁業やプロゞェクトでコヌディング芏玄を䜜成・運甚する人に察しおコヌディング芏玄䜜成の支揎を目的ずした
コヌディング䜜法ガむドです。本ガむドの特城はコヌディング芏玄を『品質を保぀ために守るべきコヌドの曞き方』ず考えル
ヌルの基本抂念を䜜法ずしおたずめたこずです。䜜法は『JIS X 0129-1 ゜フトりェア補品の品質 第郚品質モデル』に
準拠した品質抂念を基に䜜法抂芁䜜法詳现に分類・階局化しおいたす。さらにそれぞれの䜜法に蚀語に察応した
ルヌルをその必芁性ずずもに提瀺しおいたす。 この䜜法ずルヌルにより意矩・必芁性を理解できる実甚的な「コヌディング
芏玄」が容易に䜜成できるこずを目暙ずしおいたす。


1.1 背景
  コヌディング芏玄はコヌドの品質を向䞊させるために重芁なツヌルです。しかしながら経枈産業省の 2004 幎版『組蟌
み゜フトりェア産業実態調査』 及び 組み蟌み゜フト開発力匷化委員䌚 品質向䞊技術郚䌚の『メンバ䌁業ヒアリング』
では次のような課題が浮かび䞊がっおいたす。


 1. コヌディング芏玄が存圚しない。
   ※ 『組蟌み゜フトりェア産業実態調査』によれば玄半数がコヌディング芏玄が存圚しないず回答しおいたす。
 2. ルヌルの必芁性が理解されない。たたはルヌル違反に察する正しい察凊方法が理解されおいない。
 3. ルヌルが倚すぎるず芚えきれないが少ないずカバヌ範囲が䞍足する。
 4. 粟床よく怜蚌できるツヌルがなく怜蚌をレビュヌに頌っおいるので負担が倧きい。
 5. コヌディング芏玄が圢骞化しおいる。


 本ガむドではこれらの問題の䞭で1 ず 2 に察しお䞀぀の解を提䟛しおいたす。


1.2 本ガむドの察象者
   本ガむドが想定しおいる察象者ず利甚方法および期埅効果を瀺したす。


 1. コヌディング芏玄を䜜成する人
   本ガむドにより容易に新芏のコヌディング芏玄が䜜成できたす。 たたは既にあるコヌディング芏玄の確認敎理がで
   きたす。
 2. プログラマやプログラムレビュヌをする人
   本ガむドの䜜法・ルヌルを理解・修埗するこずによっお信頌性の高い保守しやすいコヌドの䜜成が無理なくできるよ
   うになりたす。


1.3 本ガむドの特城
(1) 䜓系化された䜜法・ルヌル
   本ガむドでは゜フトりェアの品質同様コヌドの品質も「信頌性」「保守性」「移怍性」などの品質特性で分類でき
るず考えルヌルの基本抂念を瀺す䜜法を『JIS X 0129-1』を基に䜓系化しおいたす。ルヌルに぀いおは䞖の䞭に存圚す
る倚くのコヌディング芏玄を十分に吟味し䜜法ず察応させる圢でコヌドの品質ずいう芳点から䜓系化し珟圚の状況蚀
語仕様や凊理系の実情にあわせお取捚遞択したした。個々の䜜法・ルヌルを品質特性で分類するこずでどの品質を保
぀こずを䞻たる目的ずしおいるのか理解できるようしおいたす。
   なお本ガむドが参照したコヌディング芏玄ずしおWG メンバ䌚瀟のコヌディング芏玄 "MISRA-C" "Indian Hill C
Style and Coding Standards""GNU coding standards" 等がありたす。詳现は巻末「匕甚・参考文献」をご参照くださ
い。



                                       4
コヌディング䜜法ガむド 0.8 ドラフト版

(2) すぐに䜿えるルヌルリファレンス
 本ガむドで瀺すルヌルはそのたた芏玄に利甚できるよう䜜成されおいたす。章「本ガむドの利甚方法」を参考に芏玄
を䜜る人が必芁ず考えるルヌルを取捚遞択しその䞊で足りないルヌルを远加するこずでC 蚀語のコヌディング芏玄を容易
に䜜成するこずが可胜です。


(3) ルヌルの必芁性を提瀺
 本ガむドではルヌルの必芁性を䜜法の衚珟ルヌル自䜓の䞭及び C 蚀語における泚意事項で提瀺しおいたす。プロ
グラマはこの䜜法ず泚意事項を参考にルヌルの必芁性を自ら理解し身に付けるこずができたす。ルヌルの倚くは熟緎し
たプログラマであればすでに知識ずしお獲埗しおいるコヌディング時の泚意事項に察応したす。


(4) 他のコヌディング芏玄ずの察応関係を明瀺
 本ガむドでは各ルヌルに぀いお䞖の䞭で䜿われおいるコヌディング芏玄ずの察応関係を瀺しおいたす。それによっお包
含関係などを確認しやすくしおいたす。察応を瀺しおいるコヌディング芏玄ずしおは "MISRA-C" "Indian Hill C Style
and Coding Standards"がありたす。


1.4 ルヌルの察象範囲

 本ガむドでは次に関するルヌルはC 蚀語のリファレンスルヌルの察象倖ずしおいたす。
    ・ラむブラリ関数
    ・メトリクス関数の行数・耇雑床など


1.5 甚語略語
   本ガむドでは以䞋の甚語ず略語を䜿甚しおいたす。
    ・ 䜜法        ゜ヌスコヌドの品質を保぀ための慣習実装の考え方であり個々のルヌルの基本抂念を瀺す。
    ・ ルヌル       守らなければならない具䜓的な䞀぀䞀぀の決め事。本ガむドでは耇数のルヌルもルヌルず呌ぶこずが
                ある。
    ・ 芏玄        ある目的を持っお集められたルヌルの集合。
    ・ 匕甚        このガむド䞭で原文献の䞭の衚珟をそのたた(意蚳を含む)䜿甚するこず。
    ・ 参考文献 このガむドを䜜成する䞊で参考にした文献。
    ・ C90       「JIS X 3010:1996 プログラム蚀語 C」で芏定される C 蚀語芏栌のこず。「JIS X 3010:1993 プログラ
                ム蚀語 C」が 1996 幎に远補・蚂正されたものである。翻蚳元の ISO/IEC 9899:1990 が 1990 幎に
                発行されたため「C90」ず呌ぶこずが倚い。なおC 蚀語芏栌はすでに改正され C99 ずなっおおりC90
                は旧芏栌である。しかしながら珟状䞖の䞭に普及しおいる芏栌がただ C90 であるこずたた改版に
                よる機胜远加は倚くはないこずなどから本ガむドでは察象ずする蚀語芏栌ずし C90 を採甚しおいる。
    ・ C99     「JIS X 3010:2003 プログラム蚀語 C」で芏定される C 蚀語芏栌のこず。C 蚀語の珟圚の芏栌である。
                翻蚳元の ISO/IEC 9899:1999 が 1999 幎に発行されたため「C99」ず呌ぶこずが倚い。
    ・ C++       「JIS X 3014:2003 プログラム蚀語 C++」で芏定される C++蚀語芏栌のこず。
    ・ MISRA-C MISRA-C:1998 及び MISRA-C:2004 のこず
    ・ MISRA-C:1998 英囜 The Motor Industry Software Reliability Association(MISRA)によっお定められた匕
                甚・参考文献[5]の芏玄のこず。
    ・ MISRA-C:2004 英囜 MISRA によっお定められた匕甚・参考文献[6]の芏玄のこず。MISRA-C:1998 の改蚂版で
                ある。



                                             5
コヌディング䜜法ガむド 0.8 ドラフト版


2. 品質特性ず䜜法
2.1 品質特性
    本ガむドでは品質を保぀コヌドを曞くために守るべき䜜法・ルヌルの着県点ずしお JIS X 0129-1 の「䞻品質特性」を
参考にしおいたす。JIS X 0129-1 の「䞻品質特性」は 次の぀の特性で構成されおいたす。
    1.信頌性  2.保守性      3.移怍性  4.効率性  5.機胜性  6.䜿甚性
このうち「機胜性」「䜿甚性」の特性に぀いおはより䞊流の蚭蚈段階以前に䜜りこむべき特性ず考え「信頌性」
「保守性」移怍性及び「効率性」の特性を䜜法の倧分類ずしお採甚しおいたす。 衚にJIS X 0129-1 の「䞻品質
特性」ず本ガむドが考える「コヌドの品質」の関係を「品質副特性」ず共に瀺したす。


                       è¡š 1 ゜フトりェアの品質特性ずコヌドの品質

 品質特性JIS X0129-1             品質副特性JIS X0129-1              コヌドの品質

                        成熟性     ゜フトりェアに朜圚する障害の結果ずしお生じ    䜿い蟌んだずきのバグの少なさ。
                                る故障を回避する゜フトりェア補品の胜力。
    指定された条件䞋で利甚        障害蚱容性    ゜フトりェアの障害郚分を実行した堎合たた    バグやむンタヌフェヌス違反などに察
ä¿¡                               は仕様化されたむンタフェヌス条件に違反が     する蚱容性。
    するずき指定された達成
é Œ                               発生した堎合に指定された達成氎準を維
    氎準を維持する゜フトりェ
性                               持する゜フトりェア補品の胜力。
    ア補品の胜力。
                        回埩性     故障時に指定された達成氎準を再確立し
                                盎接に圱響を受けたデヌタを回埩する゜フト
                                りェアの胜力。
                       信頌性暙準    信頌性に関連する芏栌たたは芏玄を遵守す
                        適合性     る゜フトりェア補品の胜力。
                        解析性     ゜フトりェアにある欠陥の蚺断たたは故障の原    コヌドの理解しやすさ。
                                因の远求及び゜フトりェアの修正箇所の識
                                別を行うための゜フトりェア補品の胜力。
                        倉曎性     指定された修正を行うこずができる゜フトりェア   コヌドの修正しやすさ。
                                補品の胜力。
保
    修正のしやすさに関する゜        安定性     ゜フトりェアの修正による予期せぬ圱響を避    修正による圱響の少なさ。
守
    フトりェア補品の胜力。                 ける゜フトりェア補品の胜力。
性
                        詊隓性     修正した゜フトりェアの劥圓性確認ができる゜    修正したコヌドのテストデバッグのし
                                フトりェア補品の胜力。              やすさ。
                       保守性暙準    保守性に関連する芏栌たたは芏玄を遵守す
                        適合性     る゜フトりェア補品の胜力。
                       環境適応性    ゜フトりェアにあらかじめ甚意された以倖の付    異なる環境ぞの適応のしやすさ。
                                加的な䜜法たたは手段なしに指定された      ※ 暙準芏栌ぞの適合性も含む。
                                異なる環境に゜フトりェアを適応させるための
                                ゜フトりェア補品の胜力。
                        蚭眮性     指定された環境に蚭眮するための゜フトりェア
                                の胜力。
移   ある環 境 から他 の環 境 に
                        共存性     共通の資源を共有する共通の環境の䞭で
怍   移すための゜フトりェア補品
                                他の独立した゜フトりェアず共存するための゜フ
性   の胜力。
                                トりェア補品の胜力。
                        眮換性     同じ環境で同じ目的のために他の指定さ
                                れた゜フトりェア補品から眮き換えお䜿甚する
                                こずができる゜フトりェア補品の胜力。
                       移怍性暙準    移怍性に関連する芏栌たたは芏玄を遵守す
                        適合性     る゜フトりェア補品の胜力。




                                        6
コヌディング䜜法ガむド 0.8 ドラフト版


品質特性JIS X0129-1                 品質副特性JIS X0129-1               コヌドの品質

                         時間効率性     明瀺的な条件の䞋で゜フトりェアの機胜を      凊理時間に関する効率性。
                                   実行する際の適切な応答時間凊理時
                                   間及び 凊理胜力を提䟛する゜フトりェア補
    明瀺的な条件の䞋で䜿                    品の胜力。
効
    甚する資源の量に察比し          資源効率性     明瀺的な条件の䞋で゜フトりェア機胜を実      資源に関する効率性。
率
    お適切な性胜を提䟛する                    行する際の資源の量及び 資源の皮類を
性
    ゜フトりェア補品の胜力。                   適切に䜿甚する゜フトりェア補品の胜力。
                         効率性暙準     効率性に関連する芏栌たたは芏玄を遵守す
                          適合性      る゜フトりェア補品の胜力。
                         合目的性      指定された䜜業及び 利甚者の具䜓目暙に
                                   察しお適切な機胜の集合を提䟛する゜フトり
                                   ェア補品の胜力。
                          正確性      必芁ずされる粟床で正しい結果若しくは正
                                   しい効果又は同意できる結果若しくは同意
                                   できる効果をもたらす゜フトりェア補品の胜
                                   力。
    ゜フトりェアが指定された
                         盞互運甚性     䞀぀以䞊の指定されたシステムず盞互䜜甚す
    条件の䞋で利甚されるずき
機                                  る゜フトりェア補品の胜力。
    に明 瀺 的 及 び 暗 瀺 的
胜
    必芁性に合臎する機胜を          セキュリティ    蚱可されおいない人又はシステムが情報又は
性
    提䟛する゜フトりェア補品                   デヌタを読んだり修正したりするこずができな
    の胜力。                           いように及び 蚱可された人又はシステムが
                                   情報又はデヌタぞのアクセスを拒吊されないよ
                                   うに情報又はデヌタを保護する゜フトりェア
                                   補品の胜力JIS X 0160:1996。
                         機胜性暙準     機胜性に関連する芏栌芏玄又は法埋䞊
                          適合性      及び 類䌌の法芏䞊の芏則を遵守する゜フト
                                   りェア補品の胜力。
                          理解性      ゜フトりェアが特定の䜜業に特定の利甚条件
                                   で適甚できるかどうか及び どのように利甚で
                                   きるかを利甚者が理解できる゜フトりェア補品
                                   の胜力。
                          習埗性      ゜フトりェアの適甚を利甚者が習埗できる゜フ
    指定された条件の䞋で利
䜿                                  トりェア補品の胜力。
甹   甚するずき理解習埗
性   利甚でき利甚者にずっお          運甚性      利甚者が゜フトりェアの運甚及び 運甚管理
    魅 力 的 で ある ゜フトりェ ア             を行うこずができる゜フトりェア補品の胜力。
    補品の胜力。                魅力性      利甚者にずっお魅力的であるための゜フトりェ
                                   ア補品の胜力。
                         䜿甚性暙準     䜿甚性に関連する芏栌芏玄スタむルガむ
                          適合性      ド又は芏則を遵守する゜フトりェア補品の胜
                                   力。




                                           7
コヌディング䜜法ガむド 0.8 ドラフト版

2.2 品質特性ず䜜法ルヌル
   本ガむドでは䜜法ルヌルを 2.1 に瀺した぀の品質特性に関連づけお分類・敎理しおいたす。本ガむドにおける䜜法
ルヌルの意味は次のずおりです図 1 参照。
   ・䜜法 ゜ヌスコヌドの品質を保぀ための慣習実装の考え方であり個々のルヌルの基本抂念を瀺す。䜜法抂芁
        䜜法詳现に階局化しお瀺しおいる。
   ・ルヌル 守らなければならない具䜓的な䞀぀䞀぀の決め事でありコヌディング芏玄を構成する。本ガむドではリファレ
        ンスずしお瀺しおいる。なおルヌルの集たりもルヌルず呌ぶこずがある。
䜜法ルヌルの倚くは耇数の品質特性ず関連したすが最も関連の匷い特性に分類しおいたす。品質特性ず関連づける
こずにより各䜜法がどのような品質に匷く圱響するかを理解できるようにしおいたす。



      品   コヌド品質向
      質   䞊の着県点             信頌性        保守性          移怍性        効率性
      抂   (JIS X0129-1)
      念
          品質向䞊のた                  プログラムは明瀺的
      䜜   めに守るべき                    に蚘述する
      法   具䜓的な実装                                                                       蚀語独立
                            動䜜が保蚌された     意味的がわかりやすい           移怍を意識した
           の考え方               蚘述を行う        蚘述をする               蚘述をする
                                                                                       䞀郚䟝存
                          リファレンスずしお提䟛
                               浮動小数点倉数は厳密な等匏、             匏の倀は、芏栌が認めるどのような順序で
          蚀語䟝存性を               非等匏のテストをしおはならない            評䟡されようずも同じでなければならない          蚀語䟝存
      ル   考慮した具䜓
      ヌ   的なコヌディ                  単項挔算子‘-’ は笊号なしの          隠蔜されおいる浮動小数点のビット衚珟は、
                                   匏に適甚しおはならない           プログラマは、いかなる方法でも䜿甚しおはならない
      ル   ングルヌルの
          リファレンス               より倧きなデヌタ型の䞀郚分にアクセスする
                                 ために共甚䜓を䜿甚しおはならない


                                                         䜜法ガむドを
                          各のコヌディング芏玄                   参考にしお䜜成
                             浮動小数点倉数は厳密な等匏、     匏の倀は、芏栌が認めるどのような順序で
                             非等匏のテストをしおはならない     評䟡されようずも同じでなければならない
                               単項挔算子‘-’ は笊号なしの   隠蔜されおいる浮動小数点のビット衚珟は、
                                匏に適甚しおはならない    プログラマは、いかなる方法でも䜿甚しおはならない
                            より倧きなデヌタ型の䞀郚分にアクセスする
                              ために共甚䜓を䜿甚しおはならない




                                  図 1 品質抂念䜜法ルヌルの関係




                                                     8
コヌディング䜜法ガむド 0.8 ドラフト版


3. 本ガむドの利甚方法
本ガむドはコヌディング芏玄䜜成支揎を目的ずし次の通りの利甚方法を想定しおいたす。
  1. 新芏コヌディング芏玄の䜜成
  2. 既存コヌディング芏玄の充実
  3. プログラマの研修独習のための孊習教材
以䞋それぞれの利甚方法を説明したす。


3.1 新芏コヌディング芏玄の䜜成
  コヌディング芏玄の存圚しないプロゞェクトが本曞を甚いお新芏にコヌディング芏玄を䜜成する堎合の手順を瀺したす。


(1) 䜜成時期
 コヌディング芏玄はプログラム蚭蚈に入る前たでに䜜成したす。コヌディング芏玄はコヌディング時に参照するルヌルの
集たりですが関数名の呜名芏玄などプログラム蚭蚈に関わるルヌルもありたす。そのためプログラム蚭蚈以前に䜜成する
必芁がありたす。


(2) 䜜成方法
 次の順序で䜜成したす。
  1. コヌディング芏玄の䜜成方針を決定
  2. 決定した䜜成方針に沿っおルヌルを遞択
  3. ルヌルのプロゞェクト䟝存郚分を定矩
 このあず必芁に応じおルヌルを远加しお䞋さい


 1. 䜜成方針の決定
  コヌディング芏玄䜜成にあたっおはたずコヌディング芏玄の䜜成方針を決定したす。コヌディング芏玄の䜜成方針ず
 はプロゞェクトが䜜成する゜フトりェアやプロゞェクトを構成する人の特性などからそのプロゞェクトで䜜成されるコヌドが
 どのようなコヌドの曞き方ずなっおいるべきかを瀺す方針のこずです。䟋えば安党性を重芖し䟿利であっおも危険な機
 胜は䜿甚しないずいう曞き方にするのか危険な機胜であっおも泚意しお䜿甚する皋床の曞き方にするかなどがこの方
 針にあたりたす。なお方針の決定にあたっおはプロゞェクトで重芖したい品質特性 及び 次に瀺す芖点を考慮しお䞋
 さい。
  ・フェヌルセヌフを考慮したコヌディング
  ・プログラムを芋やすくするコヌディング
  ・デバッグを考慮したコヌディング
  など


 2. ルヌルの遞択
  ルヌルは1.で決定した芏玄䜜成の方針に埓い遞択したす。䟋えば移怍性を重芖する方針ずした堎合移怍性
 に該圓するルヌルを倚く遞ぶなどの工倫をしお䞋さい。
  本ガむドのに瀺すルヌルリファレンスでは芏玄ずしお採甚しないずそのルヌルが属する品質特性を著しく損なうず考
 えられるルヌルに぀いお「遞択指針」欄の○で瀺しおいたす。䞀方蚀語仕様を熟知しおいる人にはあえお芏玄にする必
 芁がないず思われるルヌルに぀いお△で瀺しおいたす。 これを参考にルヌルを遞択しお䞋さい。ルヌル遞択の最も簡䟿な
 方法は○が぀いおいるルヌルのみを遞択するこずです。それによりごく䞀般的なルヌルが遞択できたす。




                             9
コヌディング䜜法ガむド 0.8 ドラフト版

 3. プロゞェクト䟝存郚分の定矩
  本ガむドのルヌルには次の皮類のルヌルがありたす。
       A 芏玄ずしおそのたた䜿えるルヌル
       B 文曞化により芏定する必芁のあるルヌル(「文」印のルヌル)
       C プロゞェクトの特性にあわせおどのルヌルずするか遞択する必芁のあるルヌル「特」印ルヌル
 B, C のルヌルはそのたたではルヌルずしお利甚できたせん。B のルヌルを採甚した堎合「4.3 ルヌル定矩の指針」ず付
録「文曞化テンプレヌト」を参考にルヌルを芏定しお文曞化しお䞋さい。C のルヌルを採甚した堎合提瀺されおいる耇数
のルヌルからいずれかのルヌルを遞択しお䞋さい。


3.2 既存コヌディング芏玄の充実
  本ガむドはコヌディング芏玄が既に存圚するプロゞェクトに察しおは既存のコヌディング芏玄をさらに充実したものずする
ための参考曞ずしお利甚できたす。


(1) 抜け・挏れの防止
 本ガむドの䜜法抂念を甚いお既存のコヌディング芏玄をカテゎラむズするこずにより抜けおいる芳点を充実させたり自
プロゞェクトが䜕に重点を眮いお䜜業しおいたか再認識するこずができたす。


(2) ルヌルの必芁性の明確化
 本ガむドの䜜法ずルヌルの適合䟋蚀語での泚意事項を利甚するこずで理由もわからず匷制されおいた芏則の必芁
性を認識するためのツヌルずしお利甚できたす。


3.3 プログラマの研修独習のための孊習教材
  本ガむドは蚀語は䞀応勉匷したが実際のコヌディングには䞍慣れ経隓が浅いなどのプログラマにずっお栌奜の孊習
教材ずなりたす。


 ・察象者
   ・蚀語を䞀通り孊習したプログラマ
   ・他蚀語でのプログラミング経隓はあるが蚀語を䜿うのは初めおずいうプログラマ


 ・孊習できるこず
  信頌性・保守性・移怍性などの芳点から分類された本ガむドを読むこずにより次のようなこずを孊習できたす。
   ・信頌性を高くするコヌディング方法
   ・バグを䜜り蟌たないようにするコヌディング方法
   ・デバッグ・テストがし易いようにするコヌディング方法
   ・他人が芋お芋やすいようにするコヌディング方法ずその必芁性
  など




                                10
コヌディング䜜法ガむド 0.8 ドラフト版


4. 䜜法ずルヌルリファレンス
 本章では コヌディング時にプログラマが守るべき䜜法ずその䜜法に察応する具䜓的なルヌルをリファレンスずしお瀺した
す。4.1 節で「4.2 䜜法ずルヌルリファレンス」の衚の芋方ず衚䞭で䜿甚しおいる甚語を説明したす。4.2 節に「䜜法ずルヌル
リファレンス」を瀺し4.3 節でルヌルを補足説明したす。


4.1 衚の芋方ず甚語
  本節では「4.2 䜜法ずルヌルリファレンス」の芋方ず衚䞭で利甚しおいる甚語を説明したす。
4.1.1 衚の芋方
  「4.2 䜜法ずルヌルリファレンス」の衚の各々の欄ずその意味は次の通りです。
(1)        (2)             (3)              (4)                (5)        (6)   (7)   (8)
品          䜜法                                                              遞    芏     関連
質                          ルヌル
                                            ルヌル           C 蚀語での泚意事項       択    箄     
抂                           No.                                            指    化
念     抂芁         詳现                                                        針
                                                                                      No.



 (1) 品質抂念             「JIS X 0129-1」の䞻品質特性に関連付けた品質抂念。
                      本曞では以䞋の぀の品質抂念を䜿甚。
                       ― 信頌性          ― 保守性       ― 移怍性     ― 効率性
 (2) 䜜法               コヌディング時にプログラマが守るべき䜜法。
                          ― 抂芁     䜜法の広い括りを抂念的に定矩。 蚀語に非䟝存。
                       ― 詳现        抂念的な䜜法を詳现化。より具䜓的に気を付けるべき䜜法。抂芁同様基
                                   本的には蚀語非䟝存であるが䞀郚「C 蚀語」の特性により䜜法化されおい
                                   るものある。
 (3) ルヌル No.   ルヌルの番号。
 (4) ルヌル       䜜法に察応する具䜓的に守らなければいけない C 蚀語甚のルヌル。リファレンスずしお瀺しおい
               る。なおこの欄のルヌルが文献の匕甚である堎合次の圢匏で瀺しおいる。
                【匕甚文献を瀺す略語 番号】
                 匕甚文献を瀺す略語
                 - MISRA : MISRA-C:2004 のこず
                 - その他は怜蚎䞭
                䟋 【MISRA 1.3】
 (5) C 蚀語での泚意事項 C 蚀語仕様䞊の泚意事項などルヌルの必芁性ルヌル違反時に生ずる問題などを説明
                      しおいる。
 (6) 遞定指針             本ガむドを甚いおコヌディング芏玄を䜜成する際のルヌルの遞定指針。
                      マヌク無し       プロゞェクトの特性に合わせお遞択すればよいず思われるルヌル。
                      △           蚀語仕様を熟知しおいる人にはあえお芏玄にする必芁がないず思われる
                                  ルヌル (経隓のあるプログラマには圓たり前なこず)。
                      ○           守らないず著しく品質特性を損なうず考えられるルヌル。
 (7) 芏玄化              察象ルヌルがプロゞェクトごずの指針によっお詳现を定める必芁があるか無いかを瀺す。
                      マヌク無し       詳现を定める必芁なし。そのたた芏玄ずしお利甚できる。
                      文           文曞化。プロゞェクトごずにルヌルを芏定し文曞化する必芁がある。芏定するべ
                                  き郚分は  で囲み明瀺しおいる。
                      特           遞択。耇数のルヌルが提瀺されおおりその䞭から遞択する必芁がある。
                                  遞択肢は括匧付き数字((1),(2),...ずいう圢匏)で瀺しおいる。
 (8) 関連ルヌル             圓該ルヌルに関連するルヌル No。



                                             11
コヌディング䜜法ガむド 0.8 ドラフト版

4.1.2 衚䞭の甚語
     本節では「4.3 䜜法ずルヌルリファレンス」で䜿甚する甚語を説明したす。


      甚語                              説明

      アクセス     倉数の参照及び 曎新を含む参照のこず。

               デヌタの型を指定するもの。charintfloat などの基本的な型を指定するものずプログ
     型指定子
               ラマが独自に typedef で定矩した型を指定するもの。
               型に特定の性質を付け加えるもの。次の 2 ぀がある。
     型修食子
                 constvolatile
               デヌタが蚘憶される堎所を指定するもの。次の 4 ぀がある。
   蚘憶クラス指定子
                 autoregisterstaticextern
               コンパむラがデヌタをメモリに配眮するずきの方法を瀺す。
     境界調敎      䟋えばint 型が 2 バむトの堎合必ずメモリの偶数アドレスから配眮するようにし奇数ア
               ドレスから配眮しないようにするこず。
               ‘??=’’??/’’??(‘ のように決められた文字をコンパむラが特定の 1 文字に解釈する
    3 文字衚蚘     文字衚蚘のこず。
               ‘??=’’??/’’??(‘ はそれぞれ’#’’’’[‘ に倉換される。

     生存期間      倉数が生成されおからプログラムからの参照が保蚌されおいる期間をいう。

               2 バむト以䞊のデヌタで衚珟される文字。挢字ひらがななどの党角文字やUnicode で
    倚バむト文字
               衚珟される文字などがある。

    ナルポむンタ     いかなるデヌタ関数ぞのポむンタず比范しおも等しくないポむンタ。

     ナル文字      文字列の最埌を衚珟する文字。’0’で衚珟される。

    ファむルスコヌプ   有効範囲がファむルの終わりたでであるこず。

               実行環境の状態に倉化を起こす凊理。次の凊理が該圓する。
      副䜜甚       volatile デヌタぞのアクセスデヌタの倉曎ファむルの倉曎及び これらの操䜜を行う
               関数呌出し。

      ブロック     デヌタ宣蚀プログラムなどで波括匧’{‘’}’で囲んだ範囲をいう。

     有効範囲      倉数などを䜿甚できる範囲のこず。スコヌプずもいう。

      列挙型      enum 型。いく぀かの列挙されたメンバで構成される。

      列挙子      列挙型enum 型のメンバのこず。




                                12
コヌディング䜜法ガむド 0.8 ドラフト版

4.2 䜜法ずルヌルリファレンス

                                                                                         遞 芏 関連
品質       䜜法                                                                           択 箄 
抂念                  No.
                                        ルヌル                          C蚀語での泚意事項           指
     抂芁     詳现                                                                           針 化 No.
  1. 領域は 領域は初期化し 1.1  自動倉数は宣蚀時に初期化する。たたは                       自動倉数を初期化しないずその倀は䞍定
ä¿¡ 初期化し おから䜿甚する。       䜿甚する盎前に初期倀を代入する。                         ずなり動䜜や環境によっお挔算結果が異な
  倧きさ生                適合䟋                                    る珟象が発生する。初期化のタむミングは宣
é Œ 存期間に気                void func() {                            蚀時たたは䜿甚する盎前ずする。䜿甚す
                          int var1 = 0; /* 宣蚀時に初期化する
  を぀けお䜿                                                         る盎前の初期化は正確には代入であり
                       */
性 甚する。                    int i;                                C++では初期化ず代入は意味が異なるので
                          var1++;                               泚意が必芁。
                          /* 䜿甚する盎前に初期倀を代入 */
                          for (i=0; i < 10; i++)                                        △
                             { /* 
 */ }
                       }
                       䞍適合䟋
                       void func() {
                          int var1;
                          var1++;
                          /* 
 */
                       }
                   1.2 const 型倉数は宣蚀時に初期化する。                    const 型倉数は埌から代入ができないので
                       適合䟋                                    宣蚀時に初期化すべきである。初期化しな
                       const int N = 10;                        いず倖郚倉数の堎合は 0自動倉数の堎合
                       䞍適合䟋                                   はが䞍定ずなるので意図しない動䜜ずなる
                       const int N;                             可胜性がある。宣蚀時に未初期化でもコン △
                                                                パむル゚ラヌにならないため泚意が必芁で
                                                                ある(C++では const の未初期化ぱラヌずな
                                                                る)。
         初期化は過䞍足 1.3 芁玠数を指定した配列の初期化では初 配列を文字列で初期化する際に配列の
         無いこずがわかるよ   期倀の数は指定した芁玠数ず䞀臎させ 倧きさずしおナル文字分を確保せずずも宣蚀
          うに蚘述する。    る。                   時にぱラヌにならない。意図した蚘述であ
                     適合䟋                れば問題ないが文字列操䜜関数等の匕
                     char var[] = "abc";  数ずしお䜿甚するず文字列の最埌を瀺すナ △
                     たたは                  ル文字がないため意図しない動䜜ずなる可
                     char var[4] = "abc"; 胜性が高い。文字列の初期化の際には
                     䞍適合䟋               最埌のナル文字分たで確保する必芁があ
                     char var[3] = "abc"; る。
                   1.4 列挙型(enum 型)のメンバの初期化は定 列挙型のメンバに初期倀を指定しない堎
                       数を党く指定しない党お指定する又は 合盎前のメンバの倀に 1 を加えた倀になる
                       最初のメンバだけを指定するのいずれかず (最初のメンバの倀は 0)。初期倀を指定した
                       する。                             り指定しなかったりするず䞍甚意に同じ倀
                       【MISRA 9.3】                     を割り圓おおしたい意図しない動䜜ずなる
                       適合䟋                           可胜性がある。䜿い方にも䟝存するがメン
                       /* E1 から E4 には異なる倀が割り付けられ バの初期化は最初 1 ぀だけに行うか党く
                       る */                            行わないかのどちらかにし同じ倀が割り振ら
                       enum etag { E1=9, E2, E3, E4 };
                                                       れるのを防止した方がよい。
                          enum etag var1;
                          var1 = E3;
                          /* var1 に入れた E3 ず E4 が等しくなるこず
                          はない */
                          if (var1 == E4 )
                          䞍適合䟋
                          enum etag { E1, E2=10, E3, E4=11 };

                          enum etag var1;
                          var1 = E3;
                          /* var1 には E3 が入るが E4 ずも等しく真ず
                          なるので分かり難い */
                          if (var1 == E4 )




                                               13
コヌディング䜜法ガむド 0.8 ドラフト版

                                                                                 遞 芏 関連
品質        䜜法                                                                  択 箄 
抂念                    No.
                                     ルヌル                     C蚀語での泚意事項           指
     抂芁        詳现                                                                針 化 No.
          ポむンタの挔算を 1.5 (1) ポむンタぞの敎数の加枛算(++,--も含 ポむンタに察する挔算を行うずポむンタの指し
          行う堎合にはポ     むは䜿甚せず確保した領域ぞの参照・ おいる先がどこなのかが分かり難くする原因ず
          むンタの指す範囲     代入は[ ]を甚いる配列圢匏で行う。          なる。すなわち確保しおいない領域を参照
          に気を付ける。      (2) ポむンタぞの敎数の加枛算(++,--も含 したり領域に曞き蟌んだりするバグを埋め
                       むはポむンタが配列を指しおいる堎合だ 蟌む可胜性が高くなる。領域の先頭を指し
                       けずし結果は配列の範囲内を指しおい おいる配列名を䜿った配列の添え字により
                       なければならない。                   配列芁玠をアクセスする方が安党なプログ
                                                   ラムずなる。
                       適合䟋                       なお(2)のルヌルにおいおポむンタはその
                       #define N 10                ポむンタを甚いお配列芁玠にアクセスしない
                       int data[N];                限り配列の最埌の芁玠を䞀぀越えたずころ
                       int i;                      を指しおもよい。すなわちint arr[MAX]        特
                       i = 1;                      p=arr ずしおp+MAX は適合しおおり
                       data[i] = 10;    /* OK */   *(p+MAX)は䞍適合である。
                       data[i+3] = 20; /* OK */
                       䞍適合䟋
                       #define N 10
                       int data[N];
                       int *p;
                       p = data;
                       *(p + 1) = 10;     /* NG */
                       p += 2;    /* NG */
                       *p = 20;
                     1.6 ポむンタ同士の枛算は同じ配列の芁玠を             C 蚀語ではポむンタ同士の枛算を行った堎
                         指すポむンタにのみ䜿甚する。                  合各ポむンタが指しおいる芁玠の間に幟぀
                         【MISRA 17.2】                    芁玠が有るかが求たる。この時各ポむンタ
                         適合䟋                           が別配列を指しおいるずその間にどのような
                         int off, var1[10];              倉数がレむアりトされるかはコンパむラ䟝存
                         int *p1, *p2;                   であり実行結果は保蚌されない。このよう
                         p1 = &var1[5];                  にポむンタ同士の枛算は同じ配列内の芁
                         p2 = &var1[2];                  玠を指しおいる堎合のみ意味がある。埓っ △
                         off = p1 - p2; /* OK */         おポむンタ枛算を行う堎合には同じ配列
                         䞍適合䟋                          を指しおいるポむンタ同士であるこずをプログラ
                         int var1[10], var2[10], off;    マが確認しお行う必芁がある。
                         int *p1, *p2;
                         p1 = &var1[5];
                         p2 = &var2[2];
                         off = p1 - p2;     /* NG */
                     1.7 ポむンタ同士の比范は同じ配列の芁玠             異なる倉数のアドレス比范をしおもコンパむル
                         たたは同じ構造䜓のメンバを指すポむンタに            ゚ラヌにならないが倉数の配眮はコンパむラ
                         だけ䜿甚する。                         䟝存なので意味の無い比范ずなる。たたこ
                         【MISRA 17.3】                    のような比范の動䜜は定矩されおいない
                         適合䟋                           未定矩の動䜜。
                         #define N 10
                         char var1[N];
                         void func(int i, int j) {
                            if (&var1[i] < &var2[j]) {                           △
                                /* ... */
                         䞍適合䟋
                         #define N 10
                         char var1[N];
                         char var2[N];
                         void func(int i, int j) {
                            if (&var1[i] < &var2[j]) {
                                /* ... */




                                           14
コヌディング䜜法ガむド 0.8 ドラフト版

                                                                                       遞 芏 関連
品質        䜜法                                                                        択 箄 
抂念                    No.
                                    ルヌル                      C蚀語での泚意事項                 指
     抂芁        詳现                                                                      針 化 No.
          解攟した領域をア 1.8 自動倉数領域は関数終了埌は䜿甚しな 自動倉数領域を関数終了埌に䜿甚した堎
          クセスしない。      い。                             合その領域は他の甚途に䜿甚される可胜
                       適合䟋                          性があるため他の領域を砎壊するこずがあ
                       extern int    data1;
                       extern int    data2;           る。
                       int *func(tag *p) {
                            p->mem = &data1; /* 静的な領
                       域のアドレスなら OK */
                            return &data2;   /* 静的な領域
                       のアドレスなら OK */
                       }
                       ...
                            tag y;
                            int *p;
                            p = func(&y);
                            *p = 10;        /* OK */
                            *y.mem = 20; /* OK */
                       䞍適合䟋                                              △
                       int *func(tag *p) {
                            int x;
                            p->mem = &x; /* 関数埩垰埌に
                       自動倉数領域が参照されおしたう(危険)
                       */
                            return &x; /* 関数埩垰埌に自動
                       倉数領域が参照されおしたう(危険) */
                       }
                       ...
                            tag y;
                            int *p;
                            p = func(&y);
                            *p = 10;        /* 䞍圓な領域を
                       砎壊 */
                            *y.mem = 20; /* 䞍圓な領域を砎壊
                       */
                    1.9 解攟した領域にアクセスしない                             動的に獲埗した領域を解攟埌に䜿甚した
                        適合䟋                                      堎合その領域は他の甚途に䜿甚される可
                        struct stag { /* リスト構造の構造䜓                 胜性があるため他の領域を砎壊するこずが
                        */
                           struct stag *st_next;                   ある。
                           ...
                        }
                        struct stag *st1; /* リスト構造のポむン
                        タ */
                        struct stag *top; /* リスト構造の先頭
                        ポむンタ */
                        struct stag *next; /* 次のリスト構造の
                        ポむンタ */
                           ...
                        for (st1 = top ;st1 != NULL; st1 = next) {
                           next = st1->st_next;
                           free(st1);
                        }
                        䞍適合䟋                                                          △
                        struct stag { /* リスト構造の構造䜓 */
                           struct stag *st_next;
                           ...
                        }
                        struct stag *st1; /* リスト構造のポむンタ
                        */
                        struct stag *top; /* リスト構造の先頭ポ
                        むンタ */
                           ...
                        /* リスト構造の構造䜓を順次解攟する凊
                        理 */
                        /* 解攟埌for 文の 3 ぀目の制埡匏で解
                        攟したポむンタにアクセスしおいるのでNG
                        */
                        for (st1 = top; st1 != NULL; st1 =
                        st1->st_next) {
                           free(st1);
                        }




                                          15
コヌディング䜜法ガむド 0.8 ドラフト版

                                                                                                    遞 芏 関連
品質          䜜法                                                                                   択 箄 
抂念                       No.
                                                ルヌル                           C蚀語での泚意事項             指
        抂芁      詳现                                                                                  針 化 No.
     2. デヌタは 内郚衚珟に䟝存 2.1 浮動小数点型倉数は厳密な等匏非等 浮動小数点型は芋た目の倀ず実装された
     範囲倧き しない比范を行       匏の比范はしない。                         倀は完党に䞀臎しおいないので比范は蚱
     さ内郚衚 う。            【MISRA 13.3】                      容誀差を考慮しお刀定する必芁がある。
     珟に気を付               適合䟋
     けお䜿甚す               #define LIMIT 1.0e-4
     る。                  void func(double d1, double d2) {
                                 double diff = d1-d2;                                               △
                                 if (-LIMIT <= diff && diff <= LIMIT) {
                                   /* 
 */
                               䞍適合䟋
                               void func(double d1, double d2) {
                                 if (d1 == d2) {
                                     /* 
 */
                        2.2 浮動小数点型倉数はルヌプカりンタずしお                           浮動小数点型はルヌプカりンタずしお挔算
                            䜿甚しない。                                        が繰り返されるず誀差が环積し意図した
                            【MISRA 13.4】                                  結果が埗られないこずがある。このためルヌ
                            適合䟋                                         プカりンタには敎数型を䜿甚すべきである。
                            void func() {
                              int i;
                              for (i=0; i < 10; i++) {                                              △
                                 /* 
 */
                            䞍適合䟋
                            void func() {
                              double d;
                              for (d=0.0; d < 1.0;d += 0.1) {
                                 /* 
 */
                        2.3 構造䜓や共甚䜓の比范に memcmp を䜿                         構造䜓や共甚䜓のメモリには未䜿甚の領
                            甚しない。                                         域が含たれる可胜性がありその領域に䜕
                            適合䟋                                         が入っおいるか分からないのでmemcmp は
                            struct {                                      䜿甚すべきでない。比范をするならメンバ
                               char c;                                    同士で行う必芁がある。たた構造䜓のメン
                               long l;                                    バの詰め物境界調敎は凊理系定矩であ
                               } var1, var2;                              る。
                            void func() {
                               if (s1.a == s2.a && s1.b == s2.b) {
                                   /* 
*/                                                           △
                            䞍適合䟋
                            struct {
                               char c;
                               long l;
                               } var1, var2;
                            void func() {
                               if (memcmp(var1, var2, sizeof(var1))
                            == 0) {
                                 /* 
 */




                                                        16
コヌディング䜜法ガむド 0.8 ドラフト版

                                                                                  遞 芏 関連
品質        䜜法                                                                   択 箄 
抂念                    No.
                                    ルヌル                    C蚀語での泚意事項              指
     抂芁        詳现                                                                 針 化 No.
          真の倀ず等しいか 2.4 真停の結果を真ずしお定矩した倀ず等しい 真は 0 でないずいう意味であり1 ずは限らな
          どうかを調べおはな    かどうかを調べおはいけない。刀定する堎合 い。
             らない。      は停(0)ず等しくないかどうかを調べる。
                       適合䟋
                       typedef int bool;
                       #define FALSE 0
                       bool func1(void);
                       void func2() {
                         if (func1() != FALSE) {
                       䞍適合䟋
                       typedef int bool;
                       #define TRUE 1
                       bool func1(void);
                       void func2() {
                         if (func1() == TRUE) {
          デヌタ型を揃えた 2.5 笊号無し敎数定数匏は結果の型で衚珟 int のビット数が異なるず同じ定数匏でも
          挔算や比范を行      できる範囲内で蚘述する。                       挔算結果がその型で衚珟できる範囲を超え
          う。           【MISRA 12.11】                      た堎合ず超えない堎合で動䜜が異なる状況
                       適合䟋                              が発生する。
                       #define M 0xffffUL
                       if ((M+1) > M)
                       /* long が 32bit であればint の bit 数が違
                       っおも問題ない */
                       䞍適合䟋
                       #define M 0xffffU
                       if ((M+1) > M)
                       /* int が 16bit の堎合ず 32bit の堎合で動
                       䜜が違う */
                     2.6 条件挔算子(?:挔算子)では論理匏は括 型が異なる蚘述を行った堎合は結果はど
                         匧で囲み返り倀は 2 ぀ずも同じ型にする。 ちらの型を期埅しおいるかを明瀺するために
                         適合䟋                                キャストを行う。
                         void func(int i1, int i2, long l1) {
                           i1 = (i1 > 10) ? i2 : (int)l1;
                         䞍適合䟋
                         void func(int i1, int i2, long l1) {
                           i1 = (i1 > 10) ? i2 : l1;
                     2.7 ルヌプカりンタずルヌプ継続条件の比范に䜿 倀の衚珟できる範囲が違う倉数の比范をル
                         甚する倉数は同じ型にする。                       ヌプの継続条件に䜿甚するず意図した結
                         適合䟋                                果にならず無限ルヌプになる堎合がある。
                         void func(int arg) {
                          int i;
                           for (i = 0; i < arg; i++) {                             △
                         䞍適合䟋
                         void func(int arg) {
                          short i;
                           for (i = 0; i < arg; i++) {




                                          17
コヌディング䜜法ガむド 0.8 ドラフト版

                                                                                        遞 芏 関連
品質        䜜法                                                                         択 箄 
抂念                    No.
                                               ルヌル               C蚀語での泚意事項              指
     抂芁        詳现                                                                       針 化 No.
          型が異なる倉数 2.8       挔算の型ず挔算結果の代入先の型が異な 挔算の型は挔算に䜿甚する匏の型によっお
          同士で挔算する           る堎合は期埅する挔算粟床の型ぞキャス 決たり代入先の型は考慮されない。挔算
          堎合は挔算粟           トしおから挔算する。                             の型ず代入先の型が異なる堎合倚くは
          床を考慮した蚘述          適合䟋                                  代入先の型の粟床の挔算を期埅しおいる。
          にする。              int i1, i2;                            このため期埅する型にキャストしおから挔算
                            long l;                                する必芁がある。
                            double d;
                            void func() {
                               d = (double)i1 / (double)i2; /* 浮動小
                            数点型での陀算 */                                                   △
                               l = ((long)i1) << i2; /* long でのシフト
                            */
                            䞍適合䟋
                            int i1, i2;
                            long l;
                            double d;
                            void func() {
                               d = i1 / i2; /* 敎数型での陀算 */
                               l = i1 << i2; /* int でのシフト */
                    2.9 笊号付きの匏ず笊号無しの匏の混圚した                   倧小比范乗陀算など挔算を笊号付きで
                        算術挔算比范を行う堎合は期埅する                   行うか笊号無しで行うかによっお結果が異
                        型に明瀺的にキャストする。                        なる挔算もある。笊号付き笊号無しを混
                        適合䟋                                圚しお蚘述した堎合どちらで行われるか
                        long l;                              はそれぞれのデヌタのサむズも考慮しお決
                        unsigned int ui;                     定されるため垞に笊号無しで行われるずは
                        void func() {                        限らない。このため混圚した算術挔算を行
                           l = l / (long)ui;
                                                             う堎合は期埅する挔算が 笊号付きか笊
                          たたは
                           l = (unsigned int)l / ui;         号無しかを確認し期埅した挔算になるよう
                                                             に明瀺的にキャストする必芁がある。たた
                               if (l < (long)ui) {           キャストするのでなく䜿甚するデヌタ型を倉
                               たたは                           曎した方がよい堎合もある。
                               if ((unsigned int)l < ui) {
                            䞍適合䟋
                            long l;
                            unsigned int ui;
                            void func() {
                               l = l / ui;
                               if(l < ui) {
                                   /* 
 */
          関数の宣蚀ず䜿 2.10     関数呌出しず関数定矩の前で関数のプロ プロトタむプ宣蚀が存圚するずコンパむラで
          甚の敎合性がずら          トタむプ宣蚀をする。                     敎合性のチェックが行われる。(C++では必須
          れおいるこずをコ         適合䟋                          である)
          ンパむラがチェックで        /* stdio.h の䞭に 関数 puts のプロトタむプ
          きる曞き方にする。         宣蚀がある */
                            #include <stdio.h>
                            void main() {                                         ○
                                 puts(" hello");
                            }
                            䞍適合䟋
                            void main() {
                                 puts(" hello");
                            }
                    2.11 匕数を持たない関数は匕数型を void ずす int func(); は匕数がない関数の宣蚀では
                         る。                      なく旧匏の宣蚀で匕数の数ず型が䞍明ず
                         【MISRA 16.5】            いう意味である。匕数がない関数を宣蚀す
                         適合䟋                   る堎合は void を明蚘する。           ○
                         int func(void);
                         䞍適合䟋
                         int func();




                                                       18
コヌディング䜜法ガむド 0.8 ドラフト版

                                                                                                   遞 芏 関連
品質        䜜法                                                                                    択 箄 
抂念                   No.
                                            ルヌル                     C蚀語での泚意事項                      指
     抂芁        詳现                                                                                  針 化 No.
          情報損倱の危険 2.12     情報損倱を起こす可胜性のあるデヌタ型ぞ 倀をその型ず異なる型の倉数に代入するず
          のある挔算は䜿甚         の代入(挔算関数呌び出しの実匕数 倀が倉わる情報損倱する可胜性がある。
          しない。䜿甚する         枡し関数埩垰)を行う堎合は問題がな 可胜であれば代入先は同じ型ずするのがよ
          堎合は問題のない         いこずを確認し問題がないこずを明瀺する い。情報損倱の恐れはない又は損倱しお
          こずを明瀺する。         ためにキャストを蚘述する。        もよいなど意図的に異なる型ぞ代入する
                           適合䟋                堎合はその意図を明瀺するためにキャスト
                           short s;             を蚘述する。
                           long l;              䜆しキャストを蚘述するより代入先のデヌ
                           void func() {        タ型を芋盎す方がよい堎合が倚いこずに泚 ○
                              s = (short)l;     意する。
                              s = (short)(s+1);
                           䞍適合䟋
                           short s;
                           long l;
                           void func() {
                              s = l;
                              s = s+1;
                    2.13 単項挔算子'-' は笊号無しの匏に䜿甚し                笊号無しの匏に単項'-'を䜿甚するこずで
                         ない。                                 挔算結果が元の笊号無しの型で衚珟でき
                         【MISRA 12.9】                        る範囲倖になった堎合予期しない動䜜ず
                         適合䟋                               なる可胜性がある。
                         int i;
                         void func() {                                                             △
                            i = -;
                         䞍適合䟋
                         unsigned int ui;
                         void func() {
                            ui = -ui;
                    2.14 unsigned char 型 又は unsigned short   unsigned char 又は unsigned short の挔算
                         型のデヌタをビット反転(~)したり巊シフト              結果は signed int ずなる。挔算によっお
                         (<<)する堎合結果の型に明瀺的にキャス               笊号ビットがオンになるず期埅した挔算結
                         トする。                                果にならない堎合がある。このため期埅す
                         【MISRA 10.5】                        る挔算の型ぞのキャストを明瀺する。
                         適合䟋
                         unsigned char uc;                                                         ○
                         void func() {
                            u = (unsigned char)(~uc) >> 1;
                         䞍適合䟋
                         unsigned char uc;
                         void func() {
                            u = (~uc) >> 1;
                    2.15 ビット列ずしお䜿甚するデヌタは笊号付き                笊号付き型のビット単䜍の挔算 ~, <<, >>,
                         型ではなく笊号無し型で定矩する。                   &, ^, | を行った結果は凊理系定矩であ
                                                             る。
                           適合䟋
                           unsigned int flags;
                           void set_x_on() {
                              flags |= 0x01;
                           䞍適合䟋
                           signed int flags;
                           void set_x_on() {
                                 flags |= 1;




                                                  19
コヌディング䜜法ガむド 0.8 ドラフト版

                                                                                      遞 芏 関連
品質        䜜法                                                                       択 箄 
抂念                      No.
                                            ルヌル                     C蚀語での泚意事項         指
     抂芁        詳现                                                                     針 化 No.
          察象デヌタが衚珟 2.16 ビットフィヌルドに䜿甚する型は signed int 笊号指定のない int をビットフィヌルドに䜿甚
          可胜な型を䜿甚       ず unsinged int だけずし1 ビット幅のビットフ した堎合笊号付き笊号無しのどちらで䜿
          する。           ィヌルドが必芁な堎合は singed int 型でな 甚されるかは凊理系定矩である。そのため
                        くunsigned int 型を䜿甚する。          笊号指定のない int 型はビットフィヌルドには
                        【MISRA 6.4, 6.5】
                        適合䟋                           䜿甚しない。たたコンパむラがサポヌトしおい
                        struct S {                      おもchar,short,long の型をビットフィヌルド
                           signed int m1:2;             に䜿甚するこずは C90 の仕様倖であるの
                        たたは                             で移怍性を考慮する堎合は䜿甚ししな ○
                           unsigned int m1:1;           い。たた1 ビットの signed int のビットフィヌル
                           };
                        䞍適合䟋                          ドが衚珟できる倀は-1 ず 0 のみずなるので1
                        struct S {                      ビットのビットフィヌルドには unsigned int を䜿
                           signed int m1:1;             甚する。
                           int m2:1;
                           char m3:1;
                           };

          ポむンタの型に気を 2.17 (1) ポむンタ型は他のポむンタ型や敎数型 ポむンタ型の倉数を他のポむンタ型にキャスト
          付ける。           に倉換しおはならない。たた逆も行っおは や代入するずポむンタの指す先の領域が
                         ならない。デヌタぞのポむンタ型に぀いおは どのようなデヌタなのかが分かり難くなる。
                         void*型ずの倉換は可ずする。                 CPU によっおはワヌド境界を指さないポむン
                         (2) ポむンタ型は他のポむンタ型に倉換し タを䜿っおポむンタの指す先を int 型でアクセ
                         おはならない。ポむンタ型のデヌタ幅以䞊の スしおしたうず実行時゚ラヌが発生するもの
                         敎数型ずの倉換は可ずする。たたデヌタぞ もありポむンタの指す先をプログラマが勝
                         のポむンタ型に぀いおはvoid*型ずの倉換 手に倉曎しおしたうず思わぬバグになる危
                         は可ずする。                           険がある。ポむンタ型の倉数は他のポむンタ
                         (3) ポむンタ型はポむンタ型のデヌタ幅以 型にキャストや代入しない方が安党である。
                         䞊の敎数型ずの倉換は可ずする。関数ぞの ポむンタ型を敎数型に倉換するこずも前述
                         ポむンタ型は敎数型以倖の型ずの倉換は の問題ず同じ危険性があり必芁な堎合
                         䞍可ずする。デヌタぞのポむンタ型は他の は経隓者を亀えたレビュヌが必芁である。
                         デヌタぞのポむンタ型ずの倉換を可ずする。 さらにint 型の扱う倀の範囲ずポむンタ型の
                         適合䟋                            扱う倀の範囲に察する泚意も必芁である。
                         int    *ip;                      int 型サむズが 32 ビットにも関わらずポむンタ
                         void *vp;                        型サむズが 64 ビットずいうこずもあるので事
                         int       n;                     前にコンパむラの仕様を確認しおおく。         ○ 特
                         n = (int)ip;      /* 2 ず 3 のルヌルに
                         OK */
                         ip = (int*)vp;   /* OK */
                         vp = (void*)ip; /* OK */

                              䞍適合䟋
                              int     *ip;
                              int     (*fp)(void);
                              float     f;
                              char      data[10];
                              fp = ip; /* NG */
                              f = ip;      /* NG */
                              ip = (int*)&data[1]; /* 1 ず 2 のルヌルに
                              NG */
                              *ip = 0;     /* CPU によっおは実行゚ラヌが
                              発生 */




                                                  20
コヌディング䜜法ガむド 0.8 ドラフト版

                                                                                          遞 芏 関連
品質          䜜法                                                                         択 箄 
抂念                     No.
                                      ルヌル                        C蚀語での泚意事項                指
       抂芁        詳现                                                                       針 化 No.
                      2.18 const や volatile 修食された領域を指すポ    const や volatile 修食された領域は参照し
                           むンタに察しconst や volatile 修食を取り   かされない領域であったり最適化をしおは
                           陀くキャストはしおはならない。                 ならない領域ずいうこずでその領域に察する
                           【MISRA 11.5】                    アクセスに泚意しなければならない。これらの
                           適合䟋                           領域を指すポむンタに察しconst や volatile
                           void func(const char *);        を取り陀くキャストを行っおしたうず前述の泚
                           const char *str;                意項目が芋えなくなりコンパむラはプログラ
                           void x() {                      ムの誀った蚘述に察し䜕もチェックできなく
                             func(str);
                                                           なる。                           ○
                             /* 
 */
                           }
                           䞍適合䟋
                           void func(char *);
                           const char *str;
                           void x() {
                             func((char*)str);
                             /* 
 */
                           }
     3 .異垞倀を 領域の倧きさを意 3.1 配列を順次にアクセスするルヌプの継続条 C 蚀語の問題ではなく領域倖をアクセスし
     考慮した曞 識した曞き方にす       件には配列の範囲内であるかの刀定を入 ないようにするためのルヌルである。
     き方にする。 る。            れる。
                          適合䟋
                          char var1[MAX];
                          for (i = 0; i < MAX && var[i] != 0; i++)
                          { /* var1 配列に 0 が未蚭定の堎合でも
                          配列の範囲倖アクセスの危険無 */
                              /* 
 */
                          䞍適合䟋
                          char var1[MAX];
                          for (i = 0; var[i] != 0; i++) { /* var1 配列
                          に 0 が未蚭定の堎合配列の範囲倖アク
                          セスの危険有 */
                              /* 
 */
                      3.2 (1) 配列の extern 宣蚀の芁玠数は必ず指 配列の倧きさを省略しお extern 宣蚀した堎
                          定する。                                       合゚ラヌにはならない。しかし配列の範囲
                          (2) 芁玠数が省略された初期化付き配列 倖のチェックするずきに倧きさが省略されおい
                          定矩に察応した配列の extern 宣蚀を陀き るずチェックに支障が発生する堎合がある。
                          配列の extern 宣蚀の芁玠数は必ず指定 このため配列の倧きさは明瀺しお宣蚀した
                          する。                                        方がよい。ただし初期倀の個数で配列の
                          適合䟋                                      倧きさを決定し䞀意に倧きさが決たらない
                          extern int var1[MAX];                      堎合などは宣蚀時の配列の倧きさを省略
                          ...                                        した方がよい堎合もある。
                          for ( i = 0; i < MAX; i++ ) { /* 配列の
                                                                                           ○ 特
                          範囲を超えおいないこずが明確 */
                                var1[i] = i ;
                          }
                          䞍適合䟋
                          extern int var1[];
                          ...
                          for ( i = 0; i < MAX; i++ ) { /* 配列の
                          範囲を超えおいるか䞍明確 */
                                var1[i] = i ;
                          }




                                            21
コヌディング䜜法ガむド 0.8 ドラフト版

                                                                                    遞 芏 関連
品質        䜜法                                                                     択 箄 
抂念                    No.
                                          ルヌル                     C蚀語での泚意事項         指
     抂芁        詳现                                                                   針 化 No.
                     3.3 メモリ操䜜を行う関数を䜿甚する堎合配 領域倖をアクセスするず意図しない結果を
                         列の範囲を超えおアクセスしない倀を枡す。 匕き起こす堎合がある。異なるサむズの領域
                         適合䟋                               を匕数に指定する堎合はデヌタ型を芋盎
                         #define N 20                        しお同じサむズに揃えるか小さな方のサむズ
                         char var1[N];                       を指定する必芁がある。たたサむズが䞍特
                         char var2[N];                       定の領域を操䜜する可胜性がある関数に
                         void func2(char*, char *,int n);    は匕数にサむズを指定するようにする。
                         void func() {
                           memcpy(var1, var2, sizeof(var2));
                           func2(var1,var2,sizeof(var2));                          △
                         䞍適合䟋
                         #define A 10
                         #define B 20
                         char var1[A];
                         char var2[B];
                         void func2(char*, char*);
                         void func1() {
                           memcpy(var1, var2, sizeof(var2));
                           func2(var1, var2);
          実行時゚ラヌにな 3.4 陀算や剰䜙算の右蟺匏は0 でないのを確 明らかに 0 でない堎合を陀き陀算や剰䜙
          る可胜性のある挔     認しおから挔算を行う。             算の右蟺が 0 でないこずを確認しおから挔算
          算に察しおは゚ラ    適合䟋                   する。そうしない堎合実行時に 0 陀算の゚
          ヌケヌスを迂回さ     if (y != 0)             ラヌが発生する可胜性がある。         ○
          せるようにチェックす         ans = x/y;
          る。           䞍適合䟋
                       ans = x/y;
                   3.5 ポむンタはナルポむンタでないこずを確認し
                       おからポむンタの指す先を参照する。
                       適合䟋
                       if (p != NULL)
                            *p = 1;
                       䞍適合䟋
                       *p = 1;
          関数が異垞を返 3.6 関数が゚ラヌ情報を返す堎合関数の埩
          す可胜性がある堎     垰倀を確認し異垞時の凊理を行う。
          合は異垞倀をチ     【MISRA 16.10】
          ェックする。       適合䟋
                       p = malloc(BUFFERSIZE);
                       if (p == NULL)
                           /* 異垞凊理 */                                 ○
                       else
                           *p = ¥0;
                       䞍適合䟋
                       p = malloc(BUFFERSIZE);
                       *p = ¥0;
          関数のパラメタずし 3.7     関数に枡す匕数に制限がある堎合関数
          お枡しおはならない         呌び出しする前に制限倀でないこずを確
          制限倀がある堎           認しおから関数呌び出しする。
          合は制限倀を枡          適合䟋
          さないようにチェッ        if ((MIN <= para) && (para <= MAX))
          クする。                    ret = func(para);
                            䞍適合䟋
                            ret = func(para);




                                                 22
コヌディング䜜法ガむド 0.8 ドラフト版

                                                                                     遞 芏 関連
品質        䜜法                                                                      択 箄 
抂念                      No.
                                      ルヌル                    C蚀語での泚意事項               指
     抂芁        詳现                                                                    針 化 No.
          倚岐分岐凊理に 3.8 if-else if 文は最埌に必ず else 節を眮く。 else 節がないずelse 節を曞き忘れおいるの
          おいお所定の条    通垞Else 条件が発生しないこずがわかっ かelse 節が発生しない if-else if 文なのか
          件以倖が発生し     おいる堎合は次のいずれかの蚘述ずする。 がわからなくなる。
          た堎合の凊理を     (i) else 節には䟋倖発生時の凊理を蚘述 通垞else 条件が発生しないこずがわかっお
          蚘述しおおく。     する。                              いる堎合でも次のように else 節を曞くこずによ
                      (ii) else 節には/* DO NOTHING */ずい っお想定倖の条件が発生した堎合のプログ
                      うコメントを入れる。                       ラムの動䜜を予枬するこずができる。
                                                        ・else 条件に想定倖の条件に察する動䜜
                      適合䟋                            を蚘述する。(䞇が䞀else 条件が発生した
                      /* else 条件が通垞発生しない堎合の 堎合のログラムの動䜜を決めおおく)
                      if-else if 文の else 節 */          たたelse 条件が発生しないコメントを蚘述
                      if (var1 == 0) {                 するだけでもプログラムがわかりやすくなる。
                             
                          ・/* DO NOTHING */のようにelse 条件
                      } else if (0 < var1) {           が発生しないこずを明瀺するコメントを蚘述
                             
                         しelse 節の曞きもれではないこずを衚珟す
                      } else {                         る。
                             /* 䟋倖凊理を蚘述する */
                           
                                                          ○
                      }
                      

                      if (var1 == 0) {
                             

                      } else if (0 < var1) {
                             

                      } else {
                             /* DO NOTHING */
                      }
                      䞍適合䟋
                      /* else 節のない if-else if 文 */
                      if (var1 == 0) {
                             ...
                      } else if (0 < var1) {
                             

                      }




                                            23
コヌディング䜜法ガむド 0.8 ドラフト版

                                                                                            遞 芏 関連
品質        䜜法                                                                             択 箄 
抂念                       No.
                                        ルヌル                       C蚀語での泚意事項                 指
     抂芁        詳现                                                                           針 化 No.
                   3.9 switch 文は必ず default 節を眮く。           default 節がないずdefault 節を曞き忘れお
                        通垞default 条件が発生しないこずがわか いるのかdefault 節が発生しない switch 文
                        っおいる堎合は次のいずれかの蚘述ずす なのかがわからなくなる。
                        る。                                  通垞default 条件が発生しないこずがわか
                          (i) default 節には䟋倖発生時の凊理を っおいる堎合でも次のように default 節を曞く
                        蚘述する。                               こずによっお想定倖の条件が発生した堎合の
                          (ii) default 節には/* DO NOTHING */ プログラムの動䜜を予枬するこずができる。
                        ずいうコメントを入れる。                         ・default 条件に想定倖の条件に察する動
                        適合䟋                               䜜を蚘述する。(䞇が䞀default 条件が発
                        /* default 条件が通垞発生しない switch 生した堎合のログラムの動䜜を決めおおく)
                        文の default 節 */                     たたdefault 条件が発生しないコメントを蚘
                        switch(var1) {                      述するだけでもプログラムがわかりやすくな
                        case 0:                             る。
                               
                             ・/* DO NOTHING */のようにdefault 条
                               break;                       件が発生しないこずを明瀺するコメントを蚘
                        case 1:                             述しdefault 節の曞きもれではないこずを衚
                               
                            珟する。
                               break;
                        default:
                               /* 䟋倖凊理を蚘述する */
                             

                               break;
                        }                                                                    ○
                        

                        switch(var1) {
                        case 0:
                               

                               break;
                        case 1:
                               

                               break;
                        default:
                               /* DO NOTHING */
                               break;
                        }
                        䞍適合䟋
                        /* default 節のない switch 文 */
                        switch(var1) {
                        case 0:
                               

                               break;
                        case 1:
                               

                               break;
                        }
          再垰呌び出しにな 3.10 実行時の利甚スタックサむズが予枬できな
          るような関数呌び      いため再垰呌び出し関数は䜿甚しない。
          出しを行わない。      【MISRA 16.2】




                                              24
Coding Guide
Coding Guide
Coding Guide
Coding Guide
Coding Guide
Coding Guide
Coding Guide
Coding Guide
Coding Guide
Coding Guide
Coding Guide
Coding Guide
Coding Guide
Coding Guide
Coding Guide
Coding Guide
Coding Guide
Coding Guide
Coding Guide
Coding Guide
Coding Guide
Coding Guide
Coding Guide
Coding Guide
Coding Guide
Coding Guide
Coding Guide
Coding Guide
Coding Guide
Coding Guide
Coding Guide
Coding Guide
Coding Guide
Coding Guide
Coding Guide
Coding Guide
Coding Guide
Coding Guide
Coding Guide
Coding Guide
Coding Guide
Coding Guide
Coding Guide
Coding Guide
Coding Guide
Coding Guide
Coding Guide
Coding Guide
Coding Guide

More Related Content

Viewers also liked

week12
week12week12
week12
masanari
 
Week10
Week10Week10
Week10
masanari
 
Prezentace Ep Eu A čR
Prezentace  Ep Eu A čRPrezentace  Ep Eu A čR
Prezentace Ep Eu A čRCuracao
 
Problem of the Week
Problem of the WeekProblem of the Week
Problem of the Week
hannahbenson
 
Blogging in the Classroom
Blogging in the ClassroomBlogging in the Classroom
Blogging in the Classroom
guest9610c629
 
Problem Of The Week Answer
Problem Of The Week AnswerProblem Of The Week Answer
Problem Of The Week Answer
hannahbenson
 
week13
week13week13
week13
masanari
 
Problem Of The Week Answer
Problem Of The Week AnswerProblem Of The Week Answer
Problem Of The Week Answer
hannahbenson
 

Viewers also liked (8)

week12
week12week12
week12
 
Week10
Week10Week10
Week10
 
Prezentace Ep Eu A čR
Prezentace  Ep Eu A čRPrezentace  Ep Eu A čR
Prezentace Ep Eu A čR
 
Problem of the Week
Problem of the WeekProblem of the Week
Problem of the Week
 
Blogging in the Classroom
Blogging in the ClassroomBlogging in the Classroom
Blogging in the Classroom
 
Problem Of The Week Answer
Problem Of The Week AnswerProblem Of The Week Answer
Problem Of The Week Answer
 
week13
week13week13
week13
 
Problem Of The Week Answer
Problem Of The Week AnswerProblem Of The Week Answer
Problem Of The Week Answer
 

Similar to Coding Guide

Force.com開発基瀎
Force.com開発基瀎Force.com開発基瀎
Force.com開発基瀎
Salesforce Developers Japan
 
垂堎動向䞊びに匊瀟補品の今埌の展望に぀いお
垂堎動向䞊びに匊瀟補品の今埌の展望に぀いお垂堎動向䞊びに匊瀟補品の今埌の展望に぀いお
垂堎動向䞊びに匊瀟補品の今埌の展望に぀いお
Ken Azuma
 
垂堎動向䞊びに匊瀟補品の今埌の展望に぀いお
垂堎動向䞊びに匊瀟補品の今埌の展望に぀いお垂堎動向䞊びに匊瀟補品の今埌の展望に぀いお
垂堎動向䞊びに匊瀟補品の今埌の展望に぀いお
Ken Azuma
 
Scalable Generator: Using Scala in SIer Business (ScalaMatsuri)
Scalable Generator: Using Scala in SIer Business (ScalaMatsuri)Scalable Generator: Using Scala in SIer Business (ScalaMatsuri)
Scalable Generator: Using Scala in SIer Business (ScalaMatsuri)
TIS Inc.
 
楜倩垂堎で䜿われおいる技術、゚ンゞニアに必芁なコアスキルずはTechnology used in Rakuten, core skills neede...
楜倩垂堎で䜿われおいる技術、゚ンゞニアに必芁なコアスキルずはTechnology used in Rakuten,  core skills  neede...楜倩垂堎で䜿われおいる技術、゚ンゞニアに必芁なコアスキルずはTechnology used in Rakuten,  core skills  neede...
楜倩垂堎で䜿われおいる技術、゚ンゞニアに必芁なコアスキルずはTechnology used in Rakuten, core skills neede...
Rakuten Group, Inc.
 
【JaSST'11 Kansai】 開発者ずテスト担圓者に最適なコラボレヌションず効率化を
【JaSST'11 Kansai】 開発者ずテスト担圓者に最適なコラボレヌションず効率化を【JaSST'11 Kansai】 開発者ずテスト担圓者に最適なコラボレヌションず効率化を
【JaSST'11 Kansai】 開発者ずテスト担圓者に最適なコラボレヌションず効率化を智治 長沢
 
Team Foundation Server  今を生きる゚ンゞニアのための開発基盀ずは 【BPStudy #63】
Team Foundation Server  今を生きる゚ンゞニアのための開発基盀ずは 【BPStudy #63】 Team Foundation Server  今を生きる゚ンゞニアのための開発基盀ずは 【BPStudy #63】
Team Foundation Server  今を生きる゚ンゞニアのための開発基盀ずは 【BPStudy #63】
智治 長沢
 
でぶさみ倏2013 キヌノヌト オレンゞレンゞャヌの資料
でぶさみ倏2013 キヌノヌト オレンゞレンゞャヌの資料でぶさみ倏2013 キヌノヌト オレンゞレンゞャヌの資料
でぶさみ倏2013 キヌノヌト オレンゞレンゞャヌの資料
Tomohiro Fujii
 
【17-D-6】「゜フトりェアの収益増倧のためのセキュリティ゜リュヌション」小池康幞氏
【17-D-6】「゜フトりェアの収益増倧のためのセキュリティ゜リュヌション」小池康幞氏【17-D-6】「゜フトりェアの収益増倧のためのセキュリティ゜リュヌション」小池康幞氏
【17-D-6】「゜フトりェアの収益増倧のためのセキュリティ゜リュヌション」小池康幞氏Developers Summit
 
はじめおのスクラム䜓隓ワヌクショップ 〜 アゞャむル時代のテスタヌを目指しお
はじめおのスクラム䜓隓ワヌクショップ 〜 アゞャむル時代のテスタヌを目指しお はじめおのスクラム䜓隓ワヌクショップ 〜 アゞャむル時代のテスタヌを目指しお
はじめおのスクラム䜓隓ワヌクショップ 〜 アゞャむル時代のテスタヌを目指しお
Rakuten Group, Inc.
 
Devguide 9911j
Devguide 9911jDevguide 9911j
Devguide 9911jJeongpyo Kong
 
Androidアプリケヌション開発䞭玚研修 前線
Androidアプリケヌション開発䞭玚研修 前線Androidアプリケヌション開発䞭玚研修 前線
Androidアプリケヌション開発䞭玚研修 前線
株匏䌚瀟 NTTテクノクロス
 
ナヌザヌ䌁業における暙準化のあり方 : QCon Tokyo 2010
ナヌザヌ䌁業における暙準化のあり方 : QCon Tokyo 2010ナヌザヌ䌁業における暙準化のあり方 : QCon Tokyo 2010
ナヌザヌ䌁業における暙準化のあり方 : QCon Tokyo 2010
Yusuke Suzuki
 
X dev 20121106
X dev 20121106X dev 20121106
X dev 20121106Ken Azuma
 
【18-B-4】゜ヌスコヌド品質、倧䞈倫ですか 静的怜蚌のススメ
【18-B-4】゜ヌスコヌド品質、倧䞈倫ですか 静的怜蚌のススメ【18-B-4】゜ヌスコヌド品質、倧䞈倫ですか 静的怜蚌のススメ
【18-B-4】゜ヌスコヌド品質、倧䞈倫ですか 静的怜蚌のススメDevelopers Summit
 
OCHaCafe2#5 倉幻自圚♪ 広がるKubernetesの゚コシステム
OCHaCafe2#5 倉幻自圚♪ 広がるKubernetesの゚コシステムOCHaCafe2#5 倉幻自圚♪ 広がるKubernetesの゚コシステム
OCHaCafe2#5 倉幻自圚♪ 広がるKubernetesの゚コシステム
オラクル゚ンゞニア通信
 
アゞャむル開発TFS導入
アゞャむル開発TFS導入アゞャむル開発TFS導入
アゞャむル開発TFS導入

 
2011幎マむクロ゜フト テクノロゞヌ振り返り開発線
2011幎マむクロ゜フト テクノロゞヌ振り返り開発線2011幎マむクロ゜フト テクノロゞヌ振り返り開発線
2011幎マむクロ゜フト テクノロゞヌ振り返り開発線
Takeshi Shinmura
 
Jasst12九州 倉貫資料アジャむル・Ruby・クラりド(ARC)を掻甚したビジネスにおけるテストの実践 #jasst12Q
Jasst12九州 倉貫資料アジャむル・Ruby・クラりド(ARC)を掻甚したビジネスにおけるテストの実践 #jasst12QJasst12九州 倉貫資料アジャむル・Ruby・クラりド(ARC)を掻甚したビジネスにおけるテストの実践 #jasst12Q
Jasst12九州 倉貫資料アジャむル・Ruby・クラりド(ARC)を掻甚したビジネスにおけるテストの実践 #jasst12Q
Yoshihito Kuranuki
 
Klocworkのご玹介
Klocworkのご玹介Klocworkのご玹介
Klocworkのご玹介
Masaru Horioka
 

Similar to Coding Guide (20)

Force.com開発基瀎
Force.com開発基瀎Force.com開発基瀎
Force.com開発基瀎
 
垂堎動向䞊びに匊瀟補品の今埌の展望に぀いお
垂堎動向䞊びに匊瀟補品の今埌の展望に぀いお垂堎動向䞊びに匊瀟補品の今埌の展望に぀いお
垂堎動向䞊びに匊瀟補品の今埌の展望に぀いお
 
垂堎動向䞊びに匊瀟補品の今埌の展望に぀いお
垂堎動向䞊びに匊瀟補品の今埌の展望に぀いお垂堎動向䞊びに匊瀟補品の今埌の展望に぀いお
垂堎動向䞊びに匊瀟補品の今埌の展望に぀いお
 
Scalable Generator: Using Scala in SIer Business (ScalaMatsuri)
Scalable Generator: Using Scala in SIer Business (ScalaMatsuri)Scalable Generator: Using Scala in SIer Business (ScalaMatsuri)
Scalable Generator: Using Scala in SIer Business (ScalaMatsuri)
 
楜倩垂堎で䜿われおいる技術、゚ンゞニアに必芁なコアスキルずはTechnology used in Rakuten, core skills neede...
楜倩垂堎で䜿われおいる技術、゚ンゞニアに必芁なコアスキルずはTechnology used in Rakuten,  core skills  neede...楜倩垂堎で䜿われおいる技術、゚ンゞニアに必芁なコアスキルずはTechnology used in Rakuten,  core skills  neede...
楜倩垂堎で䜿われおいる技術、゚ンゞニアに必芁なコアスキルずはTechnology used in Rakuten, core skills neede...
 
【JaSST'11 Kansai】 開発者ずテスト担圓者に最適なコラボレヌションず効率化を
【JaSST'11 Kansai】 開発者ずテスト担圓者に最適なコラボレヌションず効率化を【JaSST'11 Kansai】 開発者ずテスト担圓者に最適なコラボレヌションず効率化を
【JaSST'11 Kansai】 開発者ずテスト担圓者に最適なコラボレヌションず効率化を
 
Team Foundation Server  今を生きる゚ンゞニアのための開発基盀ずは 【BPStudy #63】
Team Foundation Server  今を生きる゚ンゞニアのための開発基盀ずは 【BPStudy #63】 Team Foundation Server  今を生きる゚ンゞニアのための開発基盀ずは 【BPStudy #63】
Team Foundation Server  今を生きる゚ンゞニアのための開発基盀ずは 【BPStudy #63】
 
でぶさみ倏2013 キヌノヌト オレンゞレンゞャヌの資料
でぶさみ倏2013 キヌノヌト オレンゞレンゞャヌの資料でぶさみ倏2013 キヌノヌト オレンゞレンゞャヌの資料
でぶさみ倏2013 キヌノヌト オレンゞレンゞャヌの資料
 
【17-D-6】「゜フトりェアの収益増倧のためのセキュリティ゜リュヌション」小池康幞氏
【17-D-6】「゜フトりェアの収益増倧のためのセキュリティ゜リュヌション」小池康幞氏【17-D-6】「゜フトりェアの収益増倧のためのセキュリティ゜リュヌション」小池康幞氏
【17-D-6】「゜フトりェアの収益増倧のためのセキュリティ゜リュヌション」小池康幞氏
 
はじめおのスクラム䜓隓ワヌクショップ 〜 アゞャむル時代のテスタヌを目指しお
はじめおのスクラム䜓隓ワヌクショップ 〜 アゞャむル時代のテスタヌを目指しお はじめおのスクラム䜓隓ワヌクショップ 〜 アゞャむル時代のテスタヌを目指しお
はじめおのスクラム䜓隓ワヌクショップ 〜 アゞャむル時代のテスタヌを目指しお
 
Devguide 9911j
Devguide 9911jDevguide 9911j
Devguide 9911j
 
Androidアプリケヌション開発䞭玚研修 前線
Androidアプリケヌション開発䞭玚研修 前線Androidアプリケヌション開発䞭玚研修 前線
Androidアプリケヌション開発䞭玚研修 前線
 
ナヌザヌ䌁業における暙準化のあり方 : QCon Tokyo 2010
ナヌザヌ䌁業における暙準化のあり方 : QCon Tokyo 2010ナヌザヌ䌁業における暙準化のあり方 : QCon Tokyo 2010
ナヌザヌ䌁業における暙準化のあり方 : QCon Tokyo 2010
 
X dev 20121106
X dev 20121106X dev 20121106
X dev 20121106
 
【18-B-4】゜ヌスコヌド品質、倧䞈倫ですか 静的怜蚌のススメ
【18-B-4】゜ヌスコヌド品質、倧䞈倫ですか 静的怜蚌のススメ【18-B-4】゜ヌスコヌド品質、倧䞈倫ですか 静的怜蚌のススメ
【18-B-4】゜ヌスコヌド品質、倧䞈倫ですか 静的怜蚌のススメ
 
OCHaCafe2#5 倉幻自圚♪ 広がるKubernetesの゚コシステム
OCHaCafe2#5 倉幻自圚♪ 広がるKubernetesの゚コシステムOCHaCafe2#5 倉幻自圚♪ 広がるKubernetesの゚コシステム
OCHaCafe2#5 倉幻自圚♪ 広がるKubernetesの゚コシステム
 
アゞャむル開発TFS導入
アゞャむル開発TFS導入アゞャむル開発TFS導入
アゞャむル開発TFS導入
 
2011幎マむクロ゜フト テクノロゞヌ振り返り開発線
2011幎マむクロ゜フト テクノロゞヌ振り返り開発線2011幎マむクロ゜フト テクノロゞヌ振り返り開発線
2011幎マむクロ゜フト テクノロゞヌ振り返り開発線
 
Jasst12九州 倉貫資料アジャむル・Ruby・クラりド(ARC)を掻甚したビジネスにおけるテストの実践 #jasst12Q
Jasst12九州 倉貫資料アジャむル・Ruby・クラりド(ARC)を掻甚したビジネスにおけるテストの実践 #jasst12QJasst12九州 倉貫資料アジャむル・Ruby・クラりド(ARC)を掻甚したビジネスにおけるテストの実践 #jasst12Q
Jasst12九州 倉貫資料アジャむル・Ruby・クラりド(ARC)を掻甚したビジネスにおけるテストの実践 #jasst12Q
 
Klocworkのご玹介
Klocworkのご玹介Klocworkのご玹介
Klocworkのご玹介
 

Coding Guide

  • 1. コヌディング䜜法ガむド 0.8 ドラフト版 組蟌み゜フトりェア甚 蚀語 コヌディング䜜法ガむド (0.8 ドラフト版) 2005 幎 3 月 経枈産業省 組蟌み゜フトりェア開発力匷化掚進委員䌚 独立行政法人 情報凊理掚進機構 ゜フトりェア・゚ンゞニアリングセンタヌ 1
  • 2. コヌディング䜜法ガむド 0.8 ドラフト版 コヌディング䜜法ガむド発行にあたっお 近幎組蟌み゜フトりェアの芏暡は拡倧の䞀途を蟿り倚人数による開発圢態に移行しおいたす。小芏暡であった頃は ハヌドりェア・゜フトりェアを共に熟知した少人数の開発者により開発が進められスキルレベルの統䞀は容易でした。しかし 開発者数の増倧ず共に様々なスキルレベルの開発者が参画するようになりスキルレベルの統䞀のための斜策が今たで以 䞊に必芁ずなっおいたす。特に安党性保守性 及び 移怍性を考慮した高品質な蚀語のコヌディングは組蟌み゜フ トりェア開発の䞭で基瀎䜓力ず䜍眮付けられるものず考えたす。 高品質な蚀語コヌディングのためには開発者の暗黙の了解でコヌドを蚘述するのではなくコヌディング芏玄を圢匏 知ずしお定め芏玄に基づいおコヌドを蚘述するこずが有効ず考えたす。しかしコヌディング芏玄を制定するためには蚀 語の文法に粟通しおいる必芁があるこずなど高いスキルず倚倧な劎力が必芁です。たた開発者ぞの理解を深め普及・ 培底を図るこずに倧きな障壁があるこずも事実です。 このような背景から経枈産業省組蟌み゜フトりェア開発力匷化掚進委員䌚では産官孊連携の取組みの䞀環ずしお 蚀語のコヌディング芏玄を策定しおいる方を察象にした「コヌディング䜜法ガむド」を線纂するこずにしたした。線纂に圓っお はプログラミング技法に粟通した有識者から構成されるコヌディング䜜法ワヌキンググルヌプを発足し原案を定め品質 向䞊技術郚䌚で詳现を審議する方法で策定したした。本曞は品質特性に察応しお分類した䜜法ずそれに察応するル ヌル矀から構成されおいたす。コヌディング芏玄を策定する方はルヌル矀の䞭から必芁郚分を取捚遞択するこずにより目 的に芋合ったコヌディング芏玄を策定するこずが出来るず考えたす。 本曞はコヌディング芏玄策定者はもずより開発のベテランの方には蚀語の持぀特性を俯瞰し新たな気づきのきっ かけずなり初心者の方には過去の先人が築いたノりハりを䜓埗できる実践的な教科曞ずしお利甚しおいただくこずがで きるず確信しおいたす。是非ずも本曞を有効に掻甚いただくこずにより組蟌み゜フトりェアの生産性の向䞊 及び 高品質 な゜フトりェア開発を実珟しおいただくこずを願っおやみたせん。 2005 幎 3 月 組蟌み゜フトりェア開発力匷化掚進委員䌚 品質向䞊技術郚䌚 2
  • 3. コヌディング䜜法ガむド 0.8 ドラフト版 目次 1. はじめに.............................................................................................................................. 4 1.1 背景 ....................................................................................................................................................4 1.2 本ガむドの察象者..................................................................................................................................4 1.3 本ガむドの特城 .....................................................................................................................................4 1.4 ルヌルの察象範囲..................................................................................................................................5 1.5 甚語略語 ..........................................................................................................................................5 2. 品質特性ず䜜法 ................................................................................................................. 6 2.1 品質特性.............................................................................................................................................6 2.2 品質特性ず䜜法ルヌル.........................................................................................................................8 3. 本ガむドの利甚方法............................................................................................................. 9 3.1 新芏コヌディング芏玄の䜜成 ...................................................................................................................9 3.2 既存コヌディング芏玄の充実 .................................................................................................................10 3.3 プログラマの研修独習のための孊習教材 ...............................................................................................10 4. 䜜法ずルヌルリファレンス....................................................................................................... 11 4.1 衚の芋方ず甚語 ................................................................................................................................... 11 4.1.1 衚の芋方......................................................................................................................................... 11 4.1.2 衚䞭の甚語 .....................................................................................................................................12 4.2 䜜法ずルヌルリファレンス.........................................................................................................................13 4.3 ルヌル定矩ぞの指針.............................................................................................................................48 付録A 䜜法・ルヌル䞀芧 ........................................................................................................ 56 付録B ルヌルクロスリファレンス.................................................................................................. 64 付録C 凊理系定矩文曞化テンプレヌト .................................................................................... 65 匕甚・参考文献 3
  • 4. コヌディング䜜法ガむド 0.8 ドラフト版 1. はじめに 本曞は䌁業やプロゞェクトでコヌディング芏玄を䜜成・運甚する人に察しおコヌディング芏玄䜜成の支揎を目的ずした コヌディング䜜法ガむドです。本ガむドの特城はコヌディング芏玄を『品質を保぀ために守るべきコヌドの曞き方』ず考えル ヌルの基本抂念を䜜法ずしおたずめたこずです。䜜法は『JIS X 0129-1 ゜フトりェア補品の品質 第郚品質モデル』に 準拠した品質抂念を基に䜜法抂芁䜜法詳现に分類・階局化しおいたす。さらにそれぞれの䜜法に蚀語に察応した ルヌルをその必芁性ずずもに提瀺しおいたす。 この䜜法ずルヌルにより意矩・必芁性を理解できる実甚的な「コヌディング 芏玄」が容易に䜜成できるこずを目暙ずしおいたす。 1.1 背景 コヌディング芏玄はコヌドの品質を向䞊させるために重芁なツヌルです。しかしながら経枈産業省の 2004 幎版『組蟌 み゜フトりェア産業実態調査』 及び 組み蟌み゜フト開発力匷化委員䌚 品質向䞊技術郚䌚の『メンバ䌁業ヒアリング』 では次のような課題が浮かび䞊がっおいたす。 1. コヌディング芏玄が存圚しない。 ※ 『組蟌み゜フトりェア産業実態調査』によれば玄半数がコヌディング芏玄が存圚しないず回答しおいたす。 2. ルヌルの必芁性が理解されない。たたはルヌル違反に察する正しい察凊方法が理解されおいない。 3. ルヌルが倚すぎるず芚えきれないが少ないずカバヌ範囲が䞍足する。 4. 粟床よく怜蚌できるツヌルがなく怜蚌をレビュヌに頌っおいるので負担が倧きい。 5. コヌディング芏玄が圢骞化しおいる。 本ガむドではこれらの問題の䞭で1 ず 2 に察しお䞀぀の解を提䟛しおいたす。 1.2 本ガむドの察象者 本ガむドが想定しおいる察象者ず利甚方法および期埅効果を瀺したす。 1. コヌディング芏玄を䜜成する人 本ガむドにより容易に新芏のコヌディング芏玄が䜜成できたす。 たたは既にあるコヌディング芏玄の確認敎理がで きたす。 2. プログラマやプログラムレビュヌをする人 本ガむドの䜜法・ルヌルを理解・修埗するこずによっお信頌性の高い保守しやすいコヌドの䜜成が無理なくできるよ うになりたす。 1.3 本ガむドの特城 (1) 䜓系化された䜜法・ルヌル 本ガむドでは゜フトりェアの品質同様コヌドの品質も「信頌性」「保守性」「移怍性」などの品質特性で分類でき るず考えルヌルの基本抂念を瀺す䜜法を『JIS X 0129-1』を基に䜓系化しおいたす。ルヌルに぀いおは䞖の䞭に存圚す る倚くのコヌディング芏玄を十分に吟味し䜜法ず察応させる圢でコヌドの品質ずいう芳点から䜓系化し珟圚の状況蚀 語仕様や凊理系の実情にあわせお取捚遞択したした。個々の䜜法・ルヌルを品質特性で分類するこずでどの品質を保 ぀こずを䞻たる目的ずしおいるのか理解できるようしおいたす。 なお本ガむドが参照したコヌディング芏玄ずしおWG メンバ䌚瀟のコヌディング芏玄 "MISRA-C" "Indian Hill C Style and Coding Standards""GNU coding standards" 等がありたす。詳现は巻末「匕甚・参考文献」をご参照くださ い。 4
  • 5. コヌディング䜜法ガむド 0.8 ドラフト版 (2) すぐに䜿えるルヌルリファレンス 本ガむドで瀺すルヌルはそのたた芏玄に利甚できるよう䜜成されおいたす。章「本ガむドの利甚方法」を参考に芏玄 を䜜る人が必芁ず考えるルヌルを取捚遞択しその䞊で足りないルヌルを远加するこずでC 蚀語のコヌディング芏玄を容易 に䜜成するこずが可胜です。 (3) ルヌルの必芁性を提瀺 本ガむドではルヌルの必芁性を䜜法の衚珟ルヌル自䜓の䞭及び C 蚀語における泚意事項で提瀺しおいたす。プロ グラマはこの䜜法ず泚意事項を参考にルヌルの必芁性を自ら理解し身に付けるこずができたす。ルヌルの倚くは熟緎し たプログラマであればすでに知識ずしお獲埗しおいるコヌディング時の泚意事項に察応したす。 (4) 他のコヌディング芏玄ずの察応関係を明瀺 本ガむドでは各ルヌルに぀いお䞖の䞭で䜿われおいるコヌディング芏玄ずの察応関係を瀺しおいたす。それによっお包 含関係などを確認しやすくしおいたす。察応を瀺しおいるコヌディング芏玄ずしおは "MISRA-C" "Indian Hill C Style and Coding Standards"がありたす。 1.4 ルヌルの察象範囲 本ガむドでは次に関するルヌルはC 蚀語のリファレンスルヌルの察象倖ずしおいたす。 ・ラむブラリ関数 ・メトリクス関数の行数・耇雑床など 1.5 甚語略語 本ガむドでは以䞋の甚語ず略語を䜿甚しおいたす。 ・ 䜜法 ゜ヌスコヌドの品質を保぀ための慣習実装の考え方であり個々のルヌルの基本抂念を瀺す。 ・ ルヌル 守らなければならない具䜓的な䞀぀䞀぀の決め事。本ガむドでは耇数のルヌルもルヌルず呌ぶこずが ある。 ・ 芏玄 ある目的を持っお集められたルヌルの集合。 ・ 匕甚 このガむド䞭で原文献の䞭の衚珟をそのたた(意蚳を含む)䜿甚するこず。 ・ 参考文献 このガむドを䜜成する䞊で参考にした文献。 ・ C90 「JIS X 3010:1996 プログラム蚀語 C」で芏定される C 蚀語芏栌のこず。「JIS X 3010:1993 プログラ ム蚀語 C」が 1996 幎に远補・蚂正されたものである。翻蚳元の ISO/IEC 9899:1990 が 1990 幎に 発行されたため「C90」ず呌ぶこずが倚い。なおC 蚀語芏栌はすでに改正され C99 ずなっおおりC90 は旧芏栌である。しかしながら珟状䞖の䞭に普及しおいる芏栌がただ C90 であるこずたた改版に よる機胜远加は倚くはないこずなどから本ガむドでは察象ずする蚀語芏栌ずし C90 を採甚しおいる。 ・ C99 「JIS X 3010:2003 プログラム蚀語 C」で芏定される C 蚀語芏栌のこず。C 蚀語の珟圚の芏栌である。 翻蚳元の ISO/IEC 9899:1999 が 1999 幎に発行されたため「C99」ず呌ぶこずが倚い。 ・ C++ 「JIS X 3014:2003 プログラム蚀語 C++」で芏定される C++蚀語芏栌のこず。 ・ MISRA-C MISRA-C:1998 及び MISRA-C:2004 のこず ・ MISRA-C:1998 英囜 The Motor Industry Software Reliability Association(MISRA)によっお定められた匕 甚・参考文献[5]の芏玄のこず。 ・ MISRA-C:2004 英囜 MISRA によっお定められた匕甚・参考文献[6]の芏玄のこず。MISRA-C:1998 の改蚂版で ある。 5
  • 6. コヌディング䜜法ガむド 0.8 ドラフト版 2. 品質特性ず䜜法 2.1 品質特性 本ガむドでは品質を保぀コヌドを曞くために守るべき䜜法・ルヌルの着県点ずしお JIS X 0129-1 の「䞻品質特性」を 参考にしおいたす。JIS X 0129-1 の「䞻品質特性」は 次の぀の特性で構成されおいたす。 1.信頌性 2.保守性 3.移怍性 4.効率性 5.機胜性 6.䜿甚性 このうち「機胜性」「䜿甚性」の特性に぀いおはより䞊流の蚭蚈段階以前に䜜りこむべき特性ず考え「信頌性」 「保守性」移怍性及び「効率性」の特性を䜜法の倧分類ずしお採甚しおいたす。 衚にJIS X 0129-1 の「䞻品質 特性」ず本ガむドが考える「コヌドの品質」の関係を「品質副特性」ず共に瀺したす。 è¡š 1 ゜フトりェアの品質特性ずコヌドの品質 品質特性JIS X0129-1 品質副特性JIS X0129-1 コヌドの品質 成熟性 ゜フトりェアに朜圚する障害の結果ずしお生じ 䜿い蟌んだずきのバグの少なさ。 る故障を回避する゜フトりェア補品の胜力。 指定された条件䞋で利甚 障害蚱容性 ゜フトりェアの障害郚分を実行した堎合たた バグやむンタヌフェヌス違反などに察 ä¿¡ は仕様化されたむンタフェヌス条件に違反が する蚱容性。 するずき指定された達成 é Œ 発生した堎合に指定された達成氎準を維 氎準を維持する゜フトりェ 性 持する゜フトりェア補品の胜力。 ア補品の胜力。 回埩性 故障時に指定された達成氎準を再確立し 盎接に圱響を受けたデヌタを回埩する゜フト りェアの胜力。 信頌性暙準 信頌性に関連する芏栌たたは芏玄を遵守す 適合性 る゜フトりェア補品の胜力。 解析性 ゜フトりェアにある欠陥の蚺断たたは故障の原 コヌドの理解しやすさ。 因の远求及び゜フトりェアの修正箇所の識 別を行うための゜フトりェア補品の胜力。 倉曎性 指定された修正を行うこずができる゜フトりェア コヌドの修正しやすさ。 補品の胜力。 保 修正のしやすさに関する゜ 安定性 ゜フトりェアの修正による予期せぬ圱響を避 修正による圱響の少なさ。 守 フトりェア補品の胜力。 ける゜フトりェア補品の胜力。 性 詊隓性 修正した゜フトりェアの劥圓性確認ができる゜ 修正したコヌドのテストデバッグのし フトりェア補品の胜力。 やすさ。 保守性暙準 保守性に関連する芏栌たたは芏玄を遵守す 適合性 る゜フトりェア補品の胜力。 環境適応性 ゜フトりェアにあらかじめ甚意された以倖の付 異なる環境ぞの適応のしやすさ。 加的な䜜法たたは手段なしに指定された ※ 暙準芏栌ぞの適合性も含む。 異なる環境に゜フトりェアを適応させるための ゜フトりェア補品の胜力。 蚭眮性 指定された環境に蚭眮するための゜フトりェア の胜力。 移 ある環 境 から他 の環 境 に 共存性 共通の資源を共有する共通の環境の䞭で 怍 移すための゜フトりェア補品 他の独立した゜フトりェアず共存するための゜フ 性 の胜力。 トりェア補品の胜力。 眮換性 同じ環境で同じ目的のために他の指定さ れた゜フトりェア補品から眮き換えお䜿甚する こずができる゜フトりェア補品の胜力。 移怍性暙準 移怍性に関連する芏栌たたは芏玄を遵守す 適合性 る゜フトりェア補品の胜力。 6
  • 7. コヌディング䜜法ガむド 0.8 ドラフト版 品質特性JIS X0129-1 品質副特性JIS X0129-1 コヌドの品質 時間効率性 明瀺的な条件の䞋で゜フトりェアの機胜を 凊理時間に関する効率性。 実行する際の適切な応答時間凊理時 間及び 凊理胜力を提䟛する゜フトりェア補 明瀺的な条件の䞋で䜿 品の胜力。 効 甚する資源の量に察比し 資源効率性 明瀺的な条件の䞋で゜フトりェア機胜を実 資源に関する効率性。 率 お適切な性胜を提䟛する 行する際の資源の量及び 資源の皮類を 性 ゜フトりェア補品の胜力。 適切に䜿甚する゜フトりェア補品の胜力。 効率性暙準 効率性に関連する芏栌たたは芏玄を遵守す 適合性 る゜フトりェア補品の胜力。 合目的性 指定された䜜業及び 利甚者の具䜓目暙に 察しお適切な機胜の集合を提䟛する゜フトり ェア補品の胜力。 正確性 必芁ずされる粟床で正しい結果若しくは正 しい効果又は同意できる結果若しくは同意 できる効果をもたらす゜フトりェア補品の胜 力。 ゜フトりェアが指定された 盞互運甚性 䞀぀以䞊の指定されたシステムず盞互䜜甚す 条件の䞋で利甚されるずき 機 る゜フトりェア補品の胜力。 に明 瀺 的 及 び 暗 瀺 的 胜 必芁性に合臎する機胜を セキュリティ 蚱可されおいない人又はシステムが情報又は 性 提䟛する゜フトりェア補品 デヌタを読んだり修正したりするこずができな の胜力。 いように及び 蚱可された人又はシステムが 情報又はデヌタぞのアクセスを拒吊されないよ うに情報又はデヌタを保護する゜フトりェア 補品の胜力JIS X 0160:1996。 機胜性暙準 機胜性に関連する芏栌芏玄又は法埋䞊 適合性 及び 類䌌の法芏䞊の芏則を遵守する゜フト りェア補品の胜力。 理解性 ゜フトりェアが特定の䜜業に特定の利甚条件 で適甚できるかどうか及び どのように利甚で きるかを利甚者が理解できる゜フトりェア補品 の胜力。 習埗性 ゜フトりェアの適甚を利甚者が習埗できる゜フ 指定された条件の䞋で利 䜿 トりェア補品の胜力。 甹 甚するずき理解習埗 性 利甚でき利甚者にずっお 運甚性 利甚者が゜フトりェアの運甚及び 運甚管理 魅 力 的 で ある ゜フトりェ ア を行うこずができる゜フトりェア補品の胜力。 補品の胜力。 魅力性 利甚者にずっお魅力的であるための゜フトりェ ア補品の胜力。 䜿甚性暙準 䜿甚性に関連する芏栌芏玄スタむルガむ 適合性 ド又は芏則を遵守する゜フトりェア補品の胜 力。 7
  • 8. コヌディング䜜法ガむド 0.8 ドラフト版 2.2 品質特性ず䜜法ルヌル 本ガむドでは䜜法ルヌルを 2.1 に瀺した぀の品質特性に関連づけお分類・敎理しおいたす。本ガむドにおける䜜法 ルヌルの意味は次のずおりです図 1 参照。 ・䜜法 ゜ヌスコヌドの品質を保぀ための慣習実装の考え方であり個々のルヌルの基本抂念を瀺す。䜜法抂芁 䜜法詳现に階局化しお瀺しおいる。 ・ルヌル 守らなければならない具䜓的な䞀぀䞀぀の決め事でありコヌディング芏玄を構成する。本ガむドではリファレ ンスずしお瀺しおいる。なおルヌルの集たりもルヌルず呌ぶこずがある。 䜜法ルヌルの倚くは耇数の品質特性ず関連したすが最も関連の匷い特性に分類しおいたす。品質特性ず関連づける こずにより各䜜法がどのような品質に匷く圱響するかを理解できるようにしおいたす。 品 コヌド品質向 質 䞊の着県点 信頌性 保守性 移怍性 効率性 抂 (JIS X0129-1) 念 品質向䞊のた プログラムは明瀺的 䜜 めに守るべき に蚘述する 法 具䜓的な実装 蚀語独立 動䜜が保蚌された 意味的がわかりやすい 移怍を意識した の考え方 蚘述を行う 蚘述をする 蚘述をする 䞀郚䟝存 リファレンスずしお提䟛 浮動小数点倉数は厳密な等匏、 匏の倀は、芏栌が認めるどのような順序で 蚀語䟝存性を 非等匏のテストをしおはならない 評䟡されようずも同じでなければならない 蚀語䟝存 ル 考慮した具䜓 ヌ 的なコヌディ 単項挔算子‘-’ は笊号なしの 隠蔜されおいる浮動小数点のビット衚珟は、 匏に適甚しおはならない プログラマは、いかなる方法でも䜿甚しおはならない ル ングルヌルの リファレンス より倧きなデヌタ型の䞀郚分にアクセスする ために共甚䜓を䜿甚しおはならない 䜜法ガむドを 各のコヌディング芏玄 参考にしお䜜成 浮動小数点倉数は厳密な等匏、 匏の倀は、芏栌が認めるどのような順序で 非等匏のテストをしおはならない 評䟡されようずも同じでなければならない 単項挔算子‘-’ は笊号なしの 隠蔜されおいる浮動小数点のビット衚珟は、 匏に適甚しおはならない プログラマは、いかなる方法でも䜿甚しおはならない より倧きなデヌタ型の䞀郚分にアクセスする ために共甚䜓を䜿甚しおはならない 図 1 品質抂念䜜法ルヌルの関係 8
  • 9. コヌディング䜜法ガむド 0.8 ドラフト版 3. 本ガむドの利甚方法 本ガむドはコヌディング芏玄䜜成支揎を目的ずし次の通りの利甚方法を想定しおいたす。 1. 新芏コヌディング芏玄の䜜成 2. 既存コヌディング芏玄の充実 3. プログラマの研修独習のための孊習教材 以䞋それぞれの利甚方法を説明したす。 3.1 新芏コヌディング芏玄の䜜成 コヌディング芏玄の存圚しないプロゞェクトが本曞を甚いお新芏にコヌディング芏玄を䜜成する堎合の手順を瀺したす。 (1) 䜜成時期 コヌディング芏玄はプログラム蚭蚈に入る前たでに䜜成したす。コヌディング芏玄はコヌディング時に参照するルヌルの 集たりですが関数名の呜名芏玄などプログラム蚭蚈に関わるルヌルもありたす。そのためプログラム蚭蚈以前に䜜成する 必芁がありたす。 (2) 䜜成方法 次の順序で䜜成したす。 1. コヌディング芏玄の䜜成方針を決定 2. 決定した䜜成方針に沿っおルヌルを遞択 3. ルヌルのプロゞェクト䟝存郚分を定矩 このあず必芁に応じおルヌルを远加しお䞋さい 1. 䜜成方針の決定 コヌディング芏玄䜜成にあたっおはたずコヌディング芏玄の䜜成方針を決定したす。コヌディング芏玄の䜜成方針ず はプロゞェクトが䜜成する゜フトりェアやプロゞェクトを構成する人の特性などからそのプロゞェクトで䜜成されるコヌドが どのようなコヌドの曞き方ずなっおいるべきかを瀺す方針のこずです。䟋えば安党性を重芖し䟿利であっおも危険な機 胜は䜿甚しないずいう曞き方にするのか危険な機胜であっおも泚意しお䜿甚する皋床の曞き方にするかなどがこの方 針にあたりたす。なお方針の決定にあたっおはプロゞェクトで重芖したい品質特性 及び 次に瀺す芖点を考慮しお䞋 さい。 ・フェヌルセヌフを考慮したコヌディング ・プログラムを芋やすくするコヌディング ・デバッグを考慮したコヌディング など 2. ルヌルの遞択 ルヌルは1.で決定した芏玄䜜成の方針に埓い遞択したす。䟋えば移怍性を重芖する方針ずした堎合移怍性 に該圓するルヌルを倚く遞ぶなどの工倫をしお䞋さい。 本ガむドのに瀺すルヌルリファレンスでは芏玄ずしお採甚しないずそのルヌルが属する品質特性を著しく損なうず考 えられるルヌルに぀いお「遞択指針」欄の○で瀺しおいたす。䞀方蚀語仕様を熟知しおいる人にはあえお芏玄にする必 芁がないず思われるルヌルに぀いお△で瀺しおいたす。 これを参考にルヌルを遞択しお䞋さい。ルヌル遞択の最も簡䟿な 方法は○が぀いおいるルヌルのみを遞択するこずです。それによりごく䞀般的なルヌルが遞択できたす。 9
  • 10. コヌディング䜜法ガむド 0.8 ドラフト版 3. プロゞェクト䟝存郚分の定矩 本ガむドのルヌルには次の皮類のルヌルがありたす。 A 芏玄ずしおそのたた䜿えるルヌル B 文曞化により芏定する必芁のあるルヌル(「文」印のルヌル) C プロゞェクトの特性にあわせおどのルヌルずするか遞択する必芁のあるルヌル「特」印ルヌル B, C のルヌルはそのたたではルヌルずしお利甚できたせん。B のルヌルを採甚した堎合「4.3 ルヌル定矩の指針」ず付 録「文曞化テンプレヌト」を参考にルヌルを芏定しお文曞化しお䞋さい。C のルヌルを採甚した堎合提瀺されおいる耇数 のルヌルからいずれかのルヌルを遞択しお䞋さい。 3.2 既存コヌディング芏玄の充実 本ガむドはコヌディング芏玄が既に存圚するプロゞェクトに察しおは既存のコヌディング芏玄をさらに充実したものずする ための参考曞ずしお利甚できたす。 (1) 抜け・挏れの防止 本ガむドの䜜法抂念を甚いお既存のコヌディング芏玄をカテゎラむズするこずにより抜けおいる芳点を充実させたり自 プロゞェクトが䜕に重点を眮いお䜜業しおいたか再認識するこずができたす。 (2) ルヌルの必芁性の明確化 本ガむドの䜜法ずルヌルの適合䟋蚀語での泚意事項を利甚するこずで理由もわからず匷制されおいた芏則の必芁 性を認識するためのツヌルずしお利甚できたす。 3.3 プログラマの研修独習のための孊習教材 本ガむドは蚀語は䞀応勉匷したが実際のコヌディングには䞍慣れ経隓が浅いなどのプログラマにずっお栌奜の孊習 教材ずなりたす。 ・察象者 ・蚀語を䞀通り孊習したプログラマ ・他蚀語でのプログラミング経隓はあるが蚀語を䜿うのは初めおずいうプログラマ ・孊習できるこず 信頌性・保守性・移怍性などの芳点から分類された本ガむドを読むこずにより次のようなこずを孊習できたす。 ・信頌性を高くするコヌディング方法 ・バグを䜜り蟌たないようにするコヌディング方法 ・デバッグ・テストがし易いようにするコヌディング方法 ・他人が芋お芋やすいようにするコヌディング方法ずその必芁性 など 10
  • 11. コヌディング䜜法ガむド 0.8 ドラフト版 4. 䜜法ずルヌルリファレンス 本章では コヌディング時にプログラマが守るべき䜜法ずその䜜法に察応する具䜓的なルヌルをリファレンスずしお瀺した す。4.1 節で「4.2 䜜法ずルヌルリファレンス」の衚の芋方ず衚䞭で䜿甚しおいる甚語を説明したす。4.2 節に「䜜法ずルヌル リファレンス」を瀺し4.3 節でルヌルを補足説明したす。 4.1 衚の芋方ず甚語 本節では「4.2 䜜法ずルヌルリファレンス」の芋方ず衚䞭で利甚しおいる甚語を説明したす。 4.1.1 衚の芋方 「4.2 䜜法ずルヌルリファレンス」の衚の各々の欄ずその意味は次の通りです。 (1) (2) (3) (4) (5) (6) (7) (8) 品 䜜法 遞 芏 関連 質 ルヌル ルヌル C 蚀語での泚意事項 択 箄  抂 No. 指 化 念 抂芁 詳现 針 No. (1) 品質抂念 「JIS X 0129-1」の䞻品質特性に関連付けた品質抂念。 本曞では以䞋の぀の品質抂念を䜿甚。 ― 信頌性 ― 保守性 ― 移怍性 ― 効率性 (2) 䜜法 コヌディング時にプログラマが守るべき䜜法。 ― 抂芁 䜜法の広い括りを抂念的に定矩。 蚀語に非䟝存。 ― 詳现 抂念的な䜜法を詳现化。より具䜓的に気を付けるべき䜜法。抂芁同様基 本的には蚀語非䟝存であるが䞀郚「C 蚀語」の特性により䜜法化されおい るものある。 (3) ルヌル No. ルヌルの番号。 (4) ルヌル 䜜法に察応する具䜓的に守らなければいけない C 蚀語甚のルヌル。リファレンスずしお瀺しおい る。なおこの欄のルヌルが文献の匕甚である堎合次の圢匏で瀺しおいる。 【匕甚文献を瀺す略語 番号】 匕甚文献を瀺す略語 - MISRA : MISRA-C:2004 のこず - その他は怜蚎䞭 䟋 【MISRA 1.3】 (5) C 蚀語での泚意事項 C 蚀語仕様䞊の泚意事項などルヌルの必芁性ルヌル違反時に生ずる問題などを説明 しおいる。 (6) 遞定指針 本ガむドを甚いおコヌディング芏玄を䜜成する際のルヌルの遞定指針。 マヌク無し プロゞェクトの特性に合わせお遞択すればよいず思われるルヌル。 △ 蚀語仕様を熟知しおいる人にはあえお芏玄にする必芁がないず思われる ルヌル (経隓のあるプログラマには圓たり前なこず)。 ○ 守らないず著しく品質特性を損なうず考えられるルヌル。 (7) 芏玄化 察象ルヌルがプロゞェクトごずの指針によっお詳现を定める必芁があるか無いかを瀺す。 マヌク無し 詳现を定める必芁なし。そのたた芏玄ずしお利甚できる。 文 文曞化。プロゞェクトごずにルヌルを芏定し文曞化する必芁がある。芏定するべ き郚分は  で囲み明瀺しおいる。 特 遞択。耇数のルヌルが提瀺されおおりその䞭から遞択する必芁がある。 遞択肢は括匧付き数字((1),(2),...ずいう圢匏)で瀺しおいる。 (8) 関連ルヌル 圓該ルヌルに関連するルヌル No。 11
  • 12. コヌディング䜜法ガむド 0.8 ドラフト版 4.1.2 衚䞭の甚語 本節では「4.3 䜜法ずルヌルリファレンス」で䜿甚する甚語を説明したす。 甚語 説明 アクセス 倉数の参照及び 曎新を含む参照のこず。 デヌタの型を指定するもの。charintfloat などの基本的な型を指定するものずプログ 型指定子 ラマが独自に typedef で定矩した型を指定するもの。 型に特定の性質を付け加えるもの。次の 2 ぀がある。 型修食子 constvolatile デヌタが蚘憶される堎所を指定するもの。次の 4 ぀がある。 蚘憶クラス指定子 autoregisterstaticextern コンパむラがデヌタをメモリに配眮するずきの方法を瀺す。 境界調敎 䟋えばint 型が 2 バむトの堎合必ずメモリの偶数アドレスから配眮するようにし奇数ア ドレスから配眮しないようにするこず。 ‘??=’’??/’’??(‘ のように決められた文字をコンパむラが特定の 1 文字に解釈する 3 文字衚蚘 文字衚蚘のこず。 ‘??=’’??/’’??(‘ はそれぞれ’#’’’’[‘ に倉換される。 生存期間 倉数が生成されおからプログラムからの参照が保蚌されおいる期間をいう。 2 バむト以䞊のデヌタで衚珟される文字。挢字ひらがななどの党角文字やUnicode で 倚バむト文字 衚珟される文字などがある。 ナルポむンタ いかなるデヌタ関数ぞのポむンタず比范しおも等しくないポむンタ。 ナル文字 文字列の最埌を衚珟する文字。’0’で衚珟される。 ファむルスコヌプ 有効範囲がファむルの終わりたでであるこず。 実行環境の状態に倉化を起こす凊理。次の凊理が該圓する。 副䜜甚 volatile デヌタぞのアクセスデヌタの倉曎ファむルの倉曎及び これらの操䜜を行う 関数呌出し。 ブロック デヌタ宣蚀プログラムなどで波括匧’{‘’}’で囲んだ範囲をいう。 有効範囲 倉数などを䜿甚できる範囲のこず。スコヌプずもいう。 列挙型 enum 型。いく぀かの列挙されたメンバで構成される。 列挙子 列挙型enum 型のメンバのこず。 12
  • 13. コヌディング䜜法ガむド 0.8 ドラフト版 4.2 䜜法ずルヌルリファレンス 遞 芏 関連 品質 䜜法  択 箄  抂念 No. ルヌル C蚀語での泚意事項 指 抂芁 詳现 針 化 No. 1. 領域は 領域は初期化し 1.1 自動倉数は宣蚀時に初期化する。たたは 自動倉数を初期化しないずその倀は䞍定 ä¿¡ 初期化し おから䜿甚する。 䜿甚する盎前に初期倀を代入する。 ずなり動䜜や環境によっお挔算結果が異な 倧きさ生 適合䟋 る珟象が発生する。初期化のタむミングは宣 é Œ 存期間に気 void func() { 蚀時たたは䜿甚する盎前ずする。䜿甚す int var1 = 0; /* 宣蚀時に初期化する を぀けお䜿 る盎前の初期化は正確には代入であり */ 性 甚する。 int i; C++では初期化ず代入は意味が異なるので var1++; 泚意が必芁。 /* 䜿甚する盎前に初期倀を代入 */ for (i=0; i < 10; i++) △ { /* 
 */ } } 䞍適合䟋 void func() { int var1; var1++; /* 
 */ } 1.2 const 型倉数は宣蚀時に初期化する。 const 型倉数は埌から代入ができないので 適合䟋 宣蚀時に初期化すべきである。初期化しな const int N = 10; いず倖郚倉数の堎合は 0自動倉数の堎合 䞍適合䟋 はが䞍定ずなるので意図しない動䜜ずなる const int N; 可胜性がある。宣蚀時に未初期化でもコン △ パむル゚ラヌにならないため泚意が必芁で ある(C++では const の未初期化ぱラヌずな る)。 初期化は過䞍足 1.3 芁玠数を指定した配列の初期化では初 配列を文字列で初期化する際に配列の 無いこずがわかるよ 期倀の数は指定した芁玠数ず䞀臎させ 倧きさずしおナル文字分を確保せずずも宣蚀 うに蚘述する。 る。 時にぱラヌにならない。意図した蚘述であ 適合䟋 れば問題ないが文字列操䜜関数等の匕 char var[] = "abc"; 数ずしお䜿甚するず文字列の最埌を瀺すナ △ たたは ル文字がないため意図しない動䜜ずなる可 char var[4] = "abc"; 胜性が高い。文字列の初期化の際には 䞍適合䟋 最埌のナル文字分たで確保する必芁があ char var[3] = "abc"; る。 1.4 列挙型(enum 型)のメンバの初期化は定 列挙型のメンバに初期倀を指定しない堎 数を党く指定しない党お指定する又は 合盎前のメンバの倀に 1 を加えた倀になる 最初のメンバだけを指定するのいずれかず (最初のメンバの倀は 0)。初期倀を指定した する。 り指定しなかったりするず䞍甚意に同じ倀 【MISRA 9.3】 を割り圓おおしたい意図しない動䜜ずなる 適合䟋 可胜性がある。䜿い方にも䟝存するがメン /* E1 から E4 には異なる倀が割り付けられ バの初期化は最初 1 ぀だけに行うか党く る */ 行わないかのどちらかにし同じ倀が割り振ら enum etag { E1=9, E2, E3, E4 }; れるのを防止した方がよい。 enum etag var1; var1 = E3; /* var1 に入れた E3 ず E4 が等しくなるこず はない */ if (var1 == E4 ) 䞍適合䟋 enum etag { E1, E2=10, E3, E4=11 }; enum etag var1; var1 = E3; /* var1 には E3 が入るが E4 ずも等しく真ず なるので分かり難い */ if (var1 == E4 ) 13
  • 14. コヌディング䜜法ガむド 0.8 ドラフト版 遞 芏 関連 品質 䜜法  択 箄  抂念 No. ルヌル C蚀語での泚意事項 指 抂芁 詳现 針 化 No. ポむンタの挔算を 1.5 (1) ポむンタぞの敎数の加枛算(++,--も含 ポむンタに察する挔算を行うずポむンタの指し 行う堎合にはポ むは䜿甚せず確保した領域ぞの参照・ おいる先がどこなのかが分かり難くする原因ず むンタの指す範囲 代入は[ ]を甚いる配列圢匏で行う。 なる。すなわち確保しおいない領域を参照 に気を付ける。 (2) ポむンタぞの敎数の加枛算(++,--も含 したり領域に曞き蟌んだりするバグを埋め むはポむンタが配列を指しおいる堎合だ 蟌む可胜性が高くなる。領域の先頭を指し けずし結果は配列の範囲内を指しおい おいる配列名を䜿った配列の添え字により なければならない。 配列芁玠をアクセスする方が安党なプログ ラムずなる。 適合䟋 なお(2)のルヌルにおいおポむンタはその #define N 10 ポむンタを甚いお配列芁玠にアクセスしない int data[N]; 限り配列の最埌の芁玠を䞀぀越えたずころ int i; を指しおもよい。すなわちint arr[MAX] 特 i = 1; p=arr ずしおp+MAX は適合しおおり data[i] = 10; /* OK */ *(p+MAX)は䞍適合である。 data[i+3] = 20; /* OK */ 䞍適合䟋 #define N 10 int data[N]; int *p; p = data; *(p + 1) = 10; /* NG */ p += 2; /* NG */ *p = 20; 1.6 ポむンタ同士の枛算は同じ配列の芁玠を C 蚀語ではポむンタ同士の枛算を行った堎 指すポむンタにのみ䜿甚する。 合各ポむンタが指しおいる芁玠の間に幟぀ 【MISRA 17.2】 芁玠が有るかが求たる。この時各ポむンタ 適合䟋 が別配列を指しおいるずその間にどのような int off, var1[10]; 倉数がレむアりトされるかはコンパむラ䟝存 int *p1, *p2; であり実行結果は保蚌されない。このよう p1 = &var1[5]; にポむンタ同士の枛算は同じ配列内の芁 p2 = &var1[2]; 玠を指しおいる堎合のみ意味がある。埓っ △ off = p1 - p2; /* OK */ おポむンタ枛算を行う堎合には同じ配列 䞍適合䟋 を指しおいるポむンタ同士であるこずをプログラ int var1[10], var2[10], off; マが確認しお行う必芁がある。 int *p1, *p2; p1 = &var1[5]; p2 = &var2[2]; off = p1 - p2; /* NG */ 1.7 ポむンタ同士の比范は同じ配列の芁玠 異なる倉数のアドレス比范をしおもコンパむル たたは同じ構造䜓のメンバを指すポむンタに ゚ラヌにならないが倉数の配眮はコンパむラ だけ䜿甚する。 䟝存なので意味の無い比范ずなる。たたこ 【MISRA 17.3】 のような比范の動䜜は定矩されおいない 適合䟋 未定矩の動䜜。 #define N 10 char var1[N]; void func(int i, int j) { if (&var1[i] < &var2[j]) { △ /* ... */ 䞍適合䟋 #define N 10 char var1[N]; char var2[N]; void func(int i, int j) { if (&var1[i] < &var2[j]) { /* ... */ 14
  • 15. コヌディング䜜法ガむド 0.8 ドラフト版 遞 芏 関連 品質 䜜法  択 箄  抂念 No. ルヌル C蚀語での泚意事項 指 抂芁 詳现 針 化 No. 解攟した領域をア 1.8 自動倉数領域は関数終了埌は䜿甚しな 自動倉数領域を関数終了埌に䜿甚した堎 クセスしない。 い。 合その領域は他の甚途に䜿甚される可胜 適合䟋 性があるため他の領域を砎壊するこずがあ extern int data1; extern int data2; る。 int *func(tag *p) { p->mem = &data1; /* 静的な領 域のアドレスなら OK */ return &data2; /* 静的な領域 のアドレスなら OK */ } ... tag y; int *p; p = func(&y); *p = 10; /* OK */ *y.mem = 20; /* OK */ 䞍適合䟋 △ int *func(tag *p) { int x; p->mem = &x; /* 関数埩垰埌に 自動倉数領域が参照されおしたう(危険) */ return &x; /* 関数埩垰埌に自動 倉数領域が参照されおしたう(危険) */ } ... tag y; int *p; p = func(&y); *p = 10; /* 䞍圓な領域を 砎壊 */ *y.mem = 20; /* 䞍圓な領域を砎壊 */ 1.9 解攟した領域にアクセスしない 動的に獲埗した領域を解攟埌に䜿甚した 適合䟋 堎合その領域は他の甚途に䜿甚される可 struct stag { /* リスト構造の構造䜓 胜性があるため他の領域を砎壊するこずが */ struct stag *st_next; ある。 ... } struct stag *st1; /* リスト構造のポむン タ */ struct stag *top; /* リスト構造の先頭 ポむンタ */ struct stag *next; /* 次のリスト構造の ポむンタ */ ... for (st1 = top ;st1 != NULL; st1 = next) { next = st1->st_next; free(st1); } 䞍適合䟋 △ struct stag { /* リスト構造の構造䜓 */ struct stag *st_next; ... } struct stag *st1; /* リスト構造のポむンタ */ struct stag *top; /* リスト構造の先頭ポ むンタ */ ... /* リスト構造の構造䜓を順次解攟する凊 理 */ /* 解攟埌for 文の 3 ぀目の制埡匏で解 攟したポむンタにアクセスしおいるのでNG */ for (st1 = top; st1 != NULL; st1 = st1->st_next) { free(st1); } 15
  • 16. コヌディング䜜法ガむド 0.8 ドラフト版 遞 芏 関連 品質 䜜法  択 箄  抂念 No. ルヌル C蚀語での泚意事項 指 抂芁 詳现 針 化 No. 2. デヌタは 内郚衚珟に䟝存 2.1 浮動小数点型倉数は厳密な等匏非等 浮動小数点型は芋た目の倀ず実装された 範囲倧き しない比范を行 匏の比范はしない。 倀は完党に䞀臎しおいないので比范は蚱 さ内郚衚 う。 【MISRA 13.3】 容誀差を考慮しお刀定する必芁がある。 珟に気を付 適合䟋 けお䜿甚す #define LIMIT 1.0e-4 る。 void func(double d1, double d2) { double diff = d1-d2; △ if (-LIMIT <= diff && diff <= LIMIT) { /* 
 */ 䞍適合䟋 void func(double d1, double d2) { if (d1 == d2) { /* 
 */ 2.2 浮動小数点型倉数はルヌプカりンタずしお 浮動小数点型はルヌプカりンタずしお挔算 䜿甚しない。 が繰り返されるず誀差が环積し意図した 【MISRA 13.4】 結果が埗られないこずがある。このためルヌ 適合䟋 プカりンタには敎数型を䜿甚すべきである。 void func() { int i; for (i=0; i < 10; i++) { △ /* 
 */ 䞍適合䟋 void func() { double d; for (d=0.0; d < 1.0;d += 0.1) { /* 
 */ 2.3 構造䜓や共甚䜓の比范に memcmp を䜿 構造䜓や共甚䜓のメモリには未䜿甚の領 甚しない。 域が含たれる可胜性がありその領域に䜕 適合䟋 が入っおいるか分からないのでmemcmp は struct { 䜿甚すべきでない。比范をするならメンバ char c; 同士で行う必芁がある。たた構造䜓のメン long l; バの詰め物境界調敎は凊理系定矩であ } var1, var2; る。 void func() { if (s1.a == s2.a && s1.b == s2.b) { /* 
*/ △ 䞍適合䟋 struct { char c; long l; } var1, var2; void func() { if (memcmp(var1, var2, sizeof(var1)) == 0) { /* 
 */ 16
  • 17. コヌディング䜜法ガむド 0.8 ドラフト版 遞 芏 関連 品質 䜜法  択 箄  抂念 No. ルヌル C蚀語での泚意事項 指 抂芁 詳现 針 化 No. 真の倀ず等しいか 2.4 真停の結果を真ずしお定矩した倀ず等しい 真は 0 でないずいう意味であり1 ずは限らな どうかを調べおはな かどうかを調べおはいけない。刀定する堎合 い。 らない。 は停(0)ず等しくないかどうかを調べる。 適合䟋 typedef int bool; #define FALSE 0 bool func1(void); void func2() { if (func1() != FALSE) { 䞍適合䟋 typedef int bool; #define TRUE 1 bool func1(void); void func2() { if (func1() == TRUE) { デヌタ型を揃えた 2.5 笊号無し敎数定数匏は結果の型で衚珟 int のビット数が異なるず同じ定数匏でも 挔算や比范を行 できる範囲内で蚘述する。 挔算結果がその型で衚珟できる範囲を超え う。 【MISRA 12.11】 た堎合ず超えない堎合で動䜜が異なる状況 適合䟋 が発生する。 #define M 0xffffUL if ((M+1) > M) /* long が 32bit であればint の bit 数が違 っおも問題ない */ 䞍適合䟋 #define M 0xffffU if ((M+1) > M) /* int が 16bit の堎合ず 32bit の堎合で動 䜜が違う */ 2.6 条件挔算子(?:挔算子)では論理匏は括 型が異なる蚘述を行った堎合は結果はど 匧で囲み返り倀は 2 ぀ずも同じ型にする。 ちらの型を期埅しおいるかを明瀺するために 適合䟋 キャストを行う。 void func(int i1, int i2, long l1) { i1 = (i1 > 10) ? i2 : (int)l1; 䞍適合䟋 void func(int i1, int i2, long l1) { i1 = (i1 > 10) ? i2 : l1; 2.7 ルヌプカりンタずルヌプ継続条件の比范に䜿 倀の衚珟できる範囲が違う倉数の比范をル 甚する倉数は同じ型にする。 ヌプの継続条件に䜿甚するず意図した結 適合䟋 果にならず無限ルヌプになる堎合がある。 void func(int arg) { int i; for (i = 0; i < arg; i++) { △ 䞍適合䟋 void func(int arg) { short i; for (i = 0; i < arg; i++) { 17
  • 18. コヌディング䜜法ガむド 0.8 ドラフト版 遞 芏 関連 品質 䜜法  択 箄  抂念 No. ルヌル C蚀語での泚意事項 指 抂芁 詳现 針 化 No. 型が異なる倉数 2.8 挔算の型ず挔算結果の代入先の型が異な 挔算の型は挔算に䜿甚する匏の型によっお 同士で挔算する る堎合は期埅する挔算粟床の型ぞキャス 決たり代入先の型は考慮されない。挔算 堎合は挔算粟 トしおから挔算する。 の型ず代入先の型が異なる堎合倚くは 床を考慮した蚘述 適合䟋 代入先の型の粟床の挔算を期埅しおいる。 にする。 int i1, i2; このため期埅する型にキャストしおから挔算 long l; する必芁がある。 double d; void func() { d = (double)i1 / (double)i2; /* 浮動小 数点型での陀算 */ △ l = ((long)i1) << i2; /* long でのシフト */ 䞍適合䟋 int i1, i2; long l; double d; void func() { d = i1 / i2; /* 敎数型での陀算 */ l = i1 << i2; /* int でのシフト */ 2.9 笊号付きの匏ず笊号無しの匏の混圚した 倧小比范乗陀算など挔算を笊号付きで 算術挔算比范を行う堎合は期埅する 行うか笊号無しで行うかによっお結果が異 型に明瀺的にキャストする。 なる挔算もある。笊号付き笊号無しを混 適合䟋 圚しお蚘述した堎合どちらで行われるか long l; はそれぞれのデヌタのサむズも考慮しお決 unsigned int ui; 定されるため垞に笊号無しで行われるずは void func() { 限らない。このため混圚した算術挔算を行 l = l / (long)ui; う堎合は期埅する挔算が 笊号付きか笊 たたは l = (unsigned int)l / ui; 号無しかを確認し期埅した挔算になるよう に明瀺的にキャストする必芁がある。たた if (l < (long)ui) { キャストするのでなく䜿甚するデヌタ型を倉 たたは 曎した方がよい堎合もある。 if ((unsigned int)l < ui) { 䞍適合䟋 long l; unsigned int ui; void func() { l = l / ui; if(l < ui) { /* 
 */ 関数の宣蚀ず䜿 2.10 関数呌出しず関数定矩の前で関数のプロ プロトタむプ宣蚀が存圚するずコンパむラで 甚の敎合性がずら トタむプ宣蚀をする。 敎合性のチェックが行われる。(C++では必須 れおいるこずをコ 適合䟋 である) ンパむラがチェックで /* stdio.h の䞭に 関数 puts のプロトタむプ きる曞き方にする。 宣蚀がある */ #include <stdio.h> void main() { ○ puts(" hello"); } 䞍適合䟋 void main() { puts(" hello"); } 2.11 匕数を持たない関数は匕数型を void ずす int func(); は匕数がない関数の宣蚀では る。 なく旧匏の宣蚀で匕数の数ず型が䞍明ず 【MISRA 16.5】 いう意味である。匕数がない関数を宣蚀す 適合䟋 る堎合は void を明蚘する。 ○ int func(void); 䞍適合䟋 int func(); 18
  • 19. コヌディング䜜法ガむド 0.8 ドラフト版 遞 芏 関連 品質 䜜法  択 箄  抂念 No. ルヌル C蚀語での泚意事項 指 抂芁 詳现 針 化 No. 情報損倱の危険 2.12 情報損倱を起こす可胜性のあるデヌタ型ぞ 倀をその型ず異なる型の倉数に代入するず のある挔算は䜿甚 の代入(挔算関数呌び出しの実匕数 倀が倉わる情報損倱する可胜性がある。 しない。䜿甚する 枡し関数埩垰)を行う堎合は問題がな 可胜であれば代入先は同じ型ずするのがよ 堎合は問題のない いこずを確認し問題がないこずを明瀺する い。情報損倱の恐れはない又は損倱しお こずを明瀺する。 ためにキャストを蚘述する。 もよいなど意図的に異なる型ぞ代入する 適合䟋 堎合はその意図を明瀺するためにキャスト short s; を蚘述する。 long l; 䜆しキャストを蚘述するより代入先のデヌ void func() { タ型を芋盎す方がよい堎合が倚いこずに泚 ○ s = (short)l; 意する。 s = (short)(s+1); 䞍適合䟋 short s; long l; void func() { s = l; s = s+1; 2.13 単項挔算子'-' は笊号無しの匏に䜿甚し 笊号無しの匏に単項'-'を䜿甚するこずで ない。 挔算結果が元の笊号無しの型で衚珟でき 【MISRA 12.9】 る範囲倖になった堎合予期しない動䜜ず 適合䟋 なる可胜性がある。 int i; void func() { △ i = -; 䞍適合䟋 unsigned int ui; void func() { ui = -ui; 2.14 unsigned char 型 又は unsigned short unsigned char 又は unsigned short の挔算 型のデヌタをビット反転(~)したり巊シフト 結果は signed int ずなる。挔算によっお (<<)する堎合結果の型に明瀺的にキャス 笊号ビットがオンになるず期埅した挔算結 トする。 果にならない堎合がある。このため期埅す 【MISRA 10.5】 る挔算の型ぞのキャストを明瀺する。 適合䟋 unsigned char uc; ○ void func() { u = (unsigned char)(~uc) >> 1; 䞍適合䟋 unsigned char uc; void func() { u = (~uc) >> 1; 2.15 ビット列ずしお䜿甚するデヌタは笊号付き 笊号付き型のビット単䜍の挔算 ~, <<, >>, 型ではなく笊号無し型で定矩する。 &, ^, | を行った結果は凊理系定矩であ る。 適合䟋 unsigned int flags; void set_x_on() { flags |= 0x01; 䞍適合䟋 signed int flags; void set_x_on() { flags |= 1; 19
  • 20. コヌディング䜜法ガむド 0.8 ドラフト版 遞 芏 関連 品質 䜜法  択 箄  抂念 No. ルヌル C蚀語での泚意事項 指 抂芁 詳现 針 化 No. 察象デヌタが衚珟 2.16 ビットフィヌルドに䜿甚する型は signed int 笊号指定のない int をビットフィヌルドに䜿甚 可胜な型を䜿甚 ず unsinged int だけずし1 ビット幅のビットフ した堎合笊号付き笊号無しのどちらで䜿 する。 ィヌルドが必芁な堎合は singed int 型でな 甚されるかは凊理系定矩である。そのため くunsigned int 型を䜿甚する。 笊号指定のない int 型はビットフィヌルドには 【MISRA 6.4, 6.5】 適合䟋 䜿甚しない。たたコンパむラがサポヌトしおい struct S { おもchar,short,long の型をビットフィヌルド signed int m1:2; に䜿甚するこずは C90 の仕様倖であるの たたは で移怍性を考慮する堎合は䜿甚ししな ○ unsigned int m1:1; い。たた1 ビットの signed int のビットフィヌル }; 䞍適合䟋 ドが衚珟できる倀は-1 ず 0 のみずなるので1 struct S { ビットのビットフィヌルドには unsigned int を䜿 signed int m1:1; 甚する。 int m2:1; char m3:1; }; ポむンタの型に気を 2.17 (1) ポむンタ型は他のポむンタ型や敎数型 ポむンタ型の倉数を他のポむンタ型にキャスト 付ける。 に倉換しおはならない。たた逆も行っおは や代入するずポむンタの指す先の領域が ならない。デヌタぞのポむンタ型に぀いおは どのようなデヌタなのかが分かり難くなる。 void*型ずの倉換は可ずする。 CPU によっおはワヌド境界を指さないポむン (2) ポむンタ型は他のポむンタ型に倉換し タを䜿っおポむンタの指す先を int 型でアクセ おはならない。ポむンタ型のデヌタ幅以䞊の スしおしたうず実行時゚ラヌが発生するもの 敎数型ずの倉換は可ずする。たたデヌタぞ もありポむンタの指す先をプログラマが勝 のポむンタ型に぀いおはvoid*型ずの倉換 手に倉曎しおしたうず思わぬバグになる危 は可ずする。 険がある。ポむンタ型の倉数は他のポむンタ (3) ポむンタ型はポむンタ型のデヌタ幅以 型にキャストや代入しない方が安党である。 䞊の敎数型ずの倉換は可ずする。関数ぞの ポむンタ型を敎数型に倉換するこずも前述 ポむンタ型は敎数型以倖の型ずの倉換は の問題ず同じ危険性があり必芁な堎合 䞍可ずする。デヌタぞのポむンタ型は他の は経隓者を亀えたレビュヌが必芁である。 デヌタぞのポむンタ型ずの倉換を可ずする。 さらにint 型の扱う倀の範囲ずポむンタ型の 適合䟋 扱う倀の範囲に察する泚意も必芁である。 int *ip; int 型サむズが 32 ビットにも関わらずポむンタ void *vp; 型サむズが 64 ビットずいうこずもあるので事 int n; 前にコンパむラの仕様を確認しおおく。 ○ 特 n = (int)ip; /* 2 ず 3 のルヌルに OK */ ip = (int*)vp; /* OK */ vp = (void*)ip; /* OK */ 䞍適合䟋 int *ip; int (*fp)(void); float f; char data[10]; fp = ip; /* NG */ f = ip; /* NG */ ip = (int*)&data[1]; /* 1 ず 2 のルヌルに NG */ *ip = 0; /* CPU によっおは実行゚ラヌが 発生 */ 20
  • 21. コヌディング䜜法ガむド 0.8 ドラフト版 遞 芏 関連 品質 䜜法  択 箄  抂念 No. ルヌル C蚀語での泚意事項 指 抂芁 詳现 針 化 No. 2.18 const や volatile 修食された領域を指すポ const や volatile 修食された領域は参照し むンタに察しconst や volatile 修食を取り かされない領域であったり最適化をしおは 陀くキャストはしおはならない。 ならない領域ずいうこずでその領域に察する 【MISRA 11.5】 アクセスに泚意しなければならない。これらの 適合䟋 領域を指すポむンタに察しconst や volatile void func(const char *); を取り陀くキャストを行っおしたうず前述の泚 const char *str; 意項目が芋えなくなりコンパむラはプログラ void x() { ムの誀った蚘述に察し䜕もチェックできなく func(str); なる。 ○ /* 
 */ } 䞍適合䟋 void func(char *); const char *str; void x() { func((char*)str); /* 
 */ } 3 .異垞倀を 領域の倧きさを意 3.1 配列を順次にアクセスするルヌプの継続条 C 蚀語の問題ではなく領域倖をアクセスし 考慮した曞 識した曞き方にす 件には配列の範囲内であるかの刀定を入 ないようにするためのルヌルである。 き方にする。 る。 れる。 適合䟋 char var1[MAX]; for (i = 0; i < MAX && var[i] != 0; i++) { /* var1 配列に 0 が未蚭定の堎合でも 配列の範囲倖アクセスの危険無 */ /* 
 */ 䞍適合䟋 char var1[MAX]; for (i = 0; var[i] != 0; i++) { /* var1 配列 に 0 が未蚭定の堎合配列の範囲倖アク セスの危険有 */ /* 
 */ 3.2 (1) 配列の extern 宣蚀の芁玠数は必ず指 配列の倧きさを省略しお extern 宣蚀した堎 定する。 合゚ラヌにはならない。しかし配列の範囲 (2) 芁玠数が省略された初期化付き配列 倖のチェックするずきに倧きさが省略されおい 定矩に察応した配列の extern 宣蚀を陀き るずチェックに支障が発生する堎合がある。 配列の extern 宣蚀の芁玠数は必ず指定 このため配列の倧きさは明瀺しお宣蚀した する。 方がよい。ただし初期倀の個数で配列の 適合䟋 倧きさを決定し䞀意に倧きさが決たらない extern int var1[MAX]; 堎合などは宣蚀時の配列の倧きさを省略 ... した方がよい堎合もある。 for ( i = 0; i < MAX; i++ ) { /* 配列の ○ 特 範囲を超えおいないこずが明確 */ var1[i] = i ; } 䞍適合䟋 extern int var1[]; ... for ( i = 0; i < MAX; i++ ) { /* 配列の 範囲を超えおいるか䞍明確 */ var1[i] = i ; } 21
  • 22. コヌディング䜜法ガむド 0.8 ドラフト版 遞 芏 関連 品質 䜜法  択 箄  抂念 No. ルヌル C蚀語での泚意事項 指 抂芁 詳现 針 化 No. 3.3 メモリ操䜜を行う関数を䜿甚する堎合配 領域倖をアクセスするず意図しない結果を 列の範囲を超えおアクセスしない倀を枡す。 匕き起こす堎合がある。異なるサむズの領域 適合䟋 を匕数に指定する堎合はデヌタ型を芋盎 #define N 20 しお同じサむズに揃えるか小さな方のサむズ char var1[N]; を指定する必芁がある。たたサむズが䞍特 char var2[N]; 定の領域を操䜜する可胜性がある関数に void func2(char*, char *,int n); は匕数にサむズを指定するようにする。 void func() { memcpy(var1, var2, sizeof(var2)); func2(var1,var2,sizeof(var2)); △ 䞍適合䟋 #define A 10 #define B 20 char var1[A]; char var2[B]; void func2(char*, char*); void func1() { memcpy(var1, var2, sizeof(var2)); func2(var1, var2); 実行時゚ラヌにな 3.4 陀算や剰䜙算の右蟺匏は0 でないのを確 明らかに 0 でない堎合を陀き陀算や剰䜙 る可胜性のある挔 認しおから挔算を行う。 算の右蟺が 0 でないこずを確認しおから挔算 算に察しおは゚ラ 適合䟋 する。そうしない堎合実行時に 0 陀算の゚ ヌケヌスを迂回さ if (y != 0) ラヌが発生する可胜性がある。 ○ せるようにチェックす ans = x/y; る。 䞍適合䟋 ans = x/y; 3.5 ポむンタはナルポむンタでないこずを確認し おからポむンタの指す先を参照する。 適合䟋 if (p != NULL) *p = 1; 䞍適合䟋 *p = 1; 関数が異垞を返 3.6 関数が゚ラヌ情報を返す堎合関数の埩 す可胜性がある堎 垰倀を確認し異垞時の凊理を行う。 合は異垞倀をチ 【MISRA 16.10】 ェックする。 適合䟋 p = malloc(BUFFERSIZE); if (p == NULL) /* 異垞凊理 */ ○ else *p = Â¥0; 䞍適合䟋 p = malloc(BUFFERSIZE); *p = Â¥0; 関数のパラメタずし 3.7 関数に枡す匕数に制限がある堎合関数 お枡しおはならない 呌び出しする前に制限倀でないこずを確 制限倀がある堎 認しおから関数呌び出しする。 合は制限倀を枡 適合䟋 さないようにチェッ if ((MIN <= para) && (para <= MAX)) クする。 ret = func(para); 䞍適合䟋 ret = func(para); 22
  • 23. コヌディング䜜法ガむド 0.8 ドラフト版 遞 芏 関連 品質 䜜法  択 箄  抂念 No. ルヌル C蚀語での泚意事項 指 抂芁 詳现 針 化 No. 倚岐分岐凊理に 3.8 if-else if 文は最埌に必ず else 節を眮く。 else 節がないずelse 節を曞き忘れおいるの おいお所定の条 通垞Else 条件が発生しないこずがわかっ かelse 節が発生しない if-else if 文なのか 件以倖が発生し おいる堎合は次のいずれかの蚘述ずする。 がわからなくなる。 た堎合の凊理を (i) else 節には䟋倖発生時の凊理を蚘述 通垞else 条件が発生しないこずがわかっお 蚘述しおおく。 する。 いる堎合でも次のように else 節を曞くこずによ (ii) else 節には/* DO NOTHING */ずい っお想定倖の条件が発生した堎合のプログ うコメントを入れる。 ラムの動䜜を予枬するこずができる。 ・else 条件に想定倖の条件に察する動䜜 適合䟋 を蚘述する。(䞇が䞀else 条件が発生した /* else 条件が通垞発生しない堎合の 堎合のログラムの動䜜を決めおおく) if-else if 文の else 節 */ たたelse 条件が発生しないコメントを蚘述 if (var1 == 0) { するだけでもプログラムがわかりやすくなる。 
 ・/* DO NOTHING */のようにelse 条件 } else if (0 < var1) { が発生しないこずを明瀺するコメントを蚘述 
 しelse 節の曞きもれではないこずを衚珟す } else { る。 /* 䟋倖凊理を蚘述する */ 
 ○ } 
 if (var1 == 0) { 
 } else if (0 < var1) { 
 } else { /* DO NOTHING */ } 䞍適合䟋 /* else 節のない if-else if 文 */ if (var1 == 0) { ... } else if (0 < var1) { 
 } 23
  • 24. コヌディング䜜法ガむド 0.8 ドラフト版 遞 芏 関連 品質 䜜法  択 箄  抂念 No. ルヌル C蚀語での泚意事項 指 抂芁 詳现 針 化 No. 3.9 switch 文は必ず default 節を眮く。 default 節がないずdefault 節を曞き忘れお 通垞default 条件が発生しないこずがわか いるのかdefault 節が発生しない switch 文 っおいる堎合は次のいずれかの蚘述ずす なのかがわからなくなる。 る。 通垞default 条件が発生しないこずがわか (i) default 節には䟋倖発生時の凊理を っおいる堎合でも次のように default 節を曞く 蚘述する。 こずによっお想定倖の条件が発生した堎合の (ii) default 節には/* DO NOTHING */ プログラムの動䜜を予枬するこずができる。 ずいうコメントを入れる。 ・default 条件に想定倖の条件に察する動 適合䟋 䜜を蚘述する。(䞇が䞀default 条件が発 /* default 条件が通垞発生しない switch 生した堎合のログラムの動䜜を決めおおく) 文の default 節 */ たたdefault 条件が発生しないコメントを蚘 switch(var1) { 述するだけでもプログラムがわかりやすくな case 0: る。 
 ・/* DO NOTHING */のようにdefault 条 break; 件が発生しないこずを明瀺するコメントを蚘 case 1: 述しdefault 節の曞きもれではないこずを衚 
 珟する。 break; default: /* 䟋倖凊理を蚘述する */ 
 break; } ○ 
 switch(var1) { case 0: 
 break; case 1: 
 break; default: /* DO NOTHING */ break; } 䞍適合䟋 /* default 節のない switch 文 */ switch(var1) { case 0: 
 break; case 1: 
 break; } 再垰呌び出しにな 3.10 実行時の利甚スタックサむズが予枬できな るような関数呌び いため再垰呌び出し関数は䜿甚しない。 出しを行わない。 【MISRA 16.2】 24