Programvare og produktkvalitet Frode Høgberg CONNO 690 Systems & Software DNV Consulting Det Norske Veritas § +47 67 57 90 95 } Frode.Hogberg@dnv.com Þ http://www.dnv.com/consulting/systemsandsoftware/ Disposisjon • • • • Hvorfor er programvarekvalitet viktig? Hvorfor er programvarekvalitet vanskelig? Hva er produktkvalitet? Hvordan kan man evaluere kvaliteten på et produkt? • Et eksempel på en evaluering • Litteratur 1 Hva er DNVs interesse i programvare? • DNVs mål er å sikre liv, eiendom og miljø • Vår visjon er å være ledende på risikostyringstjenester • Sikker og effektiv operasjon av skip, anlegg, systemer og tjenester er i økende grad avhengig av pålitelig programvare • DNVs fremtidige evne til å vurdere og håndtere programkvalitet er viktig for å oppnå mål og visjon Systems & Software • Risk Management – – – • Information Security – – – • Security management system and product assessment Information security risk analysis Information security process improvement Systems & Software Safety – – – – – – • Evaluation of Enterprise/Project Risk Management systems Risk analysis Implementation & improvement of Risk Management systems Safety management process assessment and consulting Software product assessment (RAMS incl.) Supplier audit and assessment Independent Verification & Validation Safety Manager role Software safety Product & Process consulting Business Critical Systems – – – – – Software Process & Product assessment and improvement Systems Risk & reliability analysis Software Product Evaluation Independent Verification & Validation Supplier audit and assessment 2 Bilindustrien • Programvare vil i løpet av 3 år utgjøre ca. 70% av utviklingskostnadene av en bil (det er 40% i dag) • 60 % av programvarekostnadene er knyttet til feilretting • 1/3 av lanseringsproblemene er knyttet til programvare • En produsent måtte tilbakekalle 57.000 biler pga. et dataproblem knyttet til frontlyktene. Telekommunikasjon • Sony måtte tilbakekalle 420.000 telefoner på grunn av programvarefeil. • SO503i er en I-mode-telefon som gir tilgang til WWW via mobiltelefonnettet. • Som et resultat av dette sank verdien av Sonys aksjer med 2,5 % på børsen i Tokyo. 3 Sikkerhetskritisk programvare • Programmeringsfeil i Therac-25, et system for strålingsterapi: 3 drept • Datafeil resulterte i feil diagnose for 12.000 pasienter • Et fly fra Air New Zealand styrtet pga en datafeil: 257 drept • Kanadiske tog kolliderte på tross av “sikre” datasystemer: 26 drept Kompleksitet og konsekvenser øker Software Content and System Complexity Safety and Business Consequences of Software Failures Time 4 Essensiell kompleksitet • [Brooks 1987] nevner fire essensielle egenskaper ved programvare som gjør programvareutvikling vanskelig: – Komplekst - ingen deler er like – Kulturelt/konvensjonelt - følger ingen naturlover, må forholde seg til standarder – “Lett” å endre - ihvertfall virker det slik – Usynlig - bare forsøksvise visuelle representasjoner Bibliotheca Alexandria Andre faktorer • Måleteorien innenfor programvare er et umodent felt • Programvare kan ikke testes uttømmende • Programvare feiler ikke gradvis • Metoder, verktøy og språk er ikke særlig standardisert • Praksis ligger ofte langt bak teori 5 Prosesskvalitet og produktkvalitet • Man har de siste årene fokusert mye på prosesskvalitet: – Capability Maturity Model – SPICE – BOOTSTRAP • Men: “Can clean pipes produce dirty water?” [Voas 1997]. • Svaret er selvfølgelig: Ja! • Til syvende og sist er det ikke kvaliteten på prosessen man er interessert i, men kvaliteten på produktet. • Produktevaluering og -sertifisering er likevel ikke noe alternativ, men et komplement til gode prosesser. Hva gjør man i flyindustrien? • Flyindustrien har noen av de strengeste kravene som finnes til programvarekvalitet • Det er også en av de industriene som har lengst erfaring med sikkerhetskritisk programvare og med sertifisering av programvarebaserte systemer • Sertifisering er basert på DO178-B • Det er hele systemer som sertifiseres, ikke frittstående programvare 6 DO-178B • 5 kritikalitetsklasser: A-E • Tilsammen 66 mål (eller krav) må oppfylles i de 10 definerte prosessene (utviklings- og verifikasjonsprosesser). For hvert mål defineres det også hva slags resultater man forventer. • Et eksempel: – I “Verification of verification process results” er det et mål at “Test coverage of software structure (statement coverage) is achieved”. Dette gjelder for klassene A-C og må for A og B også være uavhengig verifisert. • DO-178B ser ikke noe om hvordan målene skal oppnås, men stiller krav til evidens fra utviklingsprosessen. • Dette krever tett samarbeid mellom utvikler og sertifiseringsorgan gjennom hele prosessen. Produktevaluering - definisjon Technical operation that consists of producing an assessment of one or more characteristics of a software product according to a specified procedure. ISO/IEC 14598-5:1998 7 VV&T og Produktevaluering • Aktiviteter som inngår i utviklingsprosessen som og hvis mål er å sikre kvaliteten på produktet omtales gjerne som verifikasjon, validering og testing. • Produktevaluering kan være både verifikasjon og validering (testing betegnes ofte som en type validering). • Det finnes mange VV&T teknikker. De fleste av disse er anvendelige i en produktevalueringssammenheng. • Validering krever innsyn i applikasjonsområdet på en helt annen måte enn verifikasjon og er derfor vanskeligere å utføre for en tredjepart. • Man kan likevel få nyttige resultater fra en produktevaluering. ISO/IEC 14598 - Process for evaluators Requester's Requirements Establishment of Evaluation Requirements Evaluation Requirements Specification of the Evaluation Product Description Evaluator's Input Pre-defined Evaluation Specifications Evaluation Methods Product Components Requester's Input Evaluation Specification Design of the Evaluation Evaluation Tools Evaluation Records Evaluation Plan Record of Evaluation Actions Execution of the Evaluation Synthetised Evaluation Results Draft Evaluation Report Conclusion of the Evaluation Reviewed Evaluation Report 8 Kvalitetsmodeller • En kvalitetsmodell beskriver hvordan man definerer kvalitet for en gitt kontekst • Det finnes flere kvalitetsmodeller for software: McCall, Boehm og ISO 9126 [ISO 9126]. • En kvalitetsmodell er utgangspunktet for å definere kravene til en produktevaluering. ISO/IEC 9126 FUNCTIONALITY Suitability, Accuracy, Interoperability, Compliance, Security USABILITY Understandability, Learnability, Operability, MAINTAINABILITY Analysability, Changeability, Stability, Testability RELIABILITY Maturity, Fault tolerance, Recoverability EFFICIENCY Time behaviour, Resource behaviour PORTABILITY Adaptability, Installability, Conformance, Replaceability 9 Eksempler på evalueringsmoduler For « FUNCTIONALITY » characteristic evaluation : For « MAINTAINABILITY » characteristic evaluation : Source Code Complexity Measurement Functionality test coverage analysis Programming rules checking Security policy inspection (ITSEC compliance) Source code autodescription analysis User survey Inheritance relations evaluation (for OO applications) Accuracy requirements analysis ... Control flow analysis For « RELIABILITY » characteristic evaluation : Architectural relations analysis Programming rules checking Software configuration analysis Memory allocation checking Test environment analysis Fault tolerance mechanism evaluation Maintainance documentation inspection ... Test coverage measurement For « PORTABILITY » characteristic evaluation : Recovery mechanism assessment Reliability growth modelling ... For « USABILITY » characteristic evaluation : MMI (Motif, MFC, ...) style guide compliance MMI inspection User survey User documentation inspection ... Standard compiler compliance Operating system dependency analysis Programming rule checking Installation procedure inspection ... For « EFFICIENCY » characteristic evaluation : Performance profiling analysis Execution time measurement Load requirement analysis Memory allocation checking ... Hvorfor gjøre en evaluering? • Før man tar en beslutning om kjøp eller integrasjon av programvare • Før man overtar vedlikeholdsansvar for et produkt • Som del av akseptansekrav i en utviklingskontrakt • Som et beslutningsgrunnlag før man foretar ytterligere investeringer i programvare eller utviklingsselskap • Når programvaren ikke når kvalitetsmål eller mål knyttet til vedlikeholdskostnader • For å sikre produktkvalitet, kontrollere kostnader, unngå forsinkelser og begrense ansvar • For å minimalisere forretningsrisiko 10 Verktøybasert evaluering av kode • Statisk analyse – – – – Målinger (kompleksitet osv.) Regelsjekk Kontrollflytanalyse Dataflytanalyse • Dynamisk analyse – Testdekningsgrad – Minneadministrasjon – Tidsstudier (profiling) Eksempel på en evaluering Product information C source code C header files (".h" extension) C source files (".c" extension) Number Total size COMP-1 116 14,023 lines 124 44,923 lines COMP-2 607 100,934 lines 554 602,747 lines 723 114,957 lines 678 647,670 lines Product components Total Number Total size 11 Evalueringsmoduler • • • • • • • SPV - Structured Programming Verification MAV - Modular Approach Verification CSV - Coding Standard Verification SCM - Software Complexity Metrics CFA - Control Flow Analysis DFA - Data Flow Analysis SDM - Self-Descriptiveness Measurement Teknikker brukt ved evaluering • Verktøybasert – Regelsjekk – Målinger • Manuelt – Inspeksjon av regelbrudd – Analyse av kontrollflytgraf 12 Verktøy • • • • Logiscope C CodeChecker by Telelogic Logiscope C RuleChecker by Telelogic Logiscope Audit by Telelogic CodeCheck C/C++ V7 by Abraxas Vurdering av regelbrudd • Klassifisering: Excellent Good Fair Poor • Vurdering basert på: – frekvens / tetthet av regelbrudd – potensiell konsekvens av regelbrudd – faktisk konsekvens av regelbrudd 13 MAV - Modular Approach Principles • software module size limit; • information hiding/encapsulation; • parameter number limit; • one entry/one exit point in subroutine and functions; • fully defined interface. MAV - Overall Results Id. Programming conventions STMT The size of a file shall be limited to 1000 statements. - #include statements shall only be used to include header file. - Duplicating components (file, function) shall be avoided. - Declarations of objects should be at function scope unless a wider scope is necessary (no global identifiers). - All declaration at file scope should be static where possible. - The storage class attribute (extern or static) shall be explicitly defined when declaring a variable. - External objects should not be declared in more than one file. - COMP-1 COMP-2 2 (1,6%) 60 (10,1%) 1 0 some some 294 579 External resource shall not be declared at function scope. 0 11 A function shall be declared with prototypes. 2 0 RU12 Functions with no parameters shall be declared with parameter type void. 53 130 RU13 A function shall not have a variable number of parameters. 4 8 RU11 A function shall have an explicit return type. 0 0 CF05 A function shall have a single exit point. 125 (15,5%) 507 (8,3%) RC09 A non void function shall return a value. 2 6 PARA The number of function formal parameters shall be limited to 7. 6 (0,7%) 95 (1,6%) CALD The number of functions called shall be limited to 15. 6 (0,7%) 186 (3,0%) 14 MAV - Declaration at Function Scope <filename> int LowMem = LOW_MEM_WARNING_LEVEL_A; word8_a long int int ldelay int lwait int cwait int step PrinterDebugLevel = 0; MaxDelay=5; = = = = 1; 10; 100; 10; if (ldelay==1) { if (pchar == 0x0D) { taskDelay(lwait); } } else { taskDelay(lwait); } Dead code? } MAV - Functions with No Parameters: void <filename>: 29 extern void FeedWatchdog (); extern void ResetSystemFault (void); <filename>: 756 void TyemmTest (viod) { #define INT_NUM_IRQ0 #define INT_LVL STATUS 0x20 0xD Res; 15 CSV - Typical Rules of Coding Standard • details of modularisation; • limited use or avoidance of certain language constructs; • restriction on interrupt enabled execution of safety-critical code; during the • lay out of the code; • no unconditional jumps. CSV - Use of Dynamic Memory Allocation in Use of reall callo mallo MemAllo MemReallo AcMall AcCallo Total oc c c c c oc c COMP-1 ac_lib libraries vxworks_targe t COMP-2 as_main audrive <file> blc blceq blceqdum bsrlib cc domain dz …. 0 4 4 99 5 93 1 0 0 38 38 49 49 190 96 93 1 1 1 1 134 1 110 14 1269 2 4 0 1413 2 110 28 15 121 33 2 65 51 35 1 2 10 15 121 33 1 63 51 35 4 16 CSV - No more than one statement per line <filename> (401) LoggerKeyboardHandler void LoggerKeyboardHandler( eventtype_a type, val_a instance, val_a user ) { Empty statement char buffer[256]; AcConsoleInput(buffer); if (buffer[0] == 'q'); { ExitLogger(); Always executed } } /* LoggerKeyboardHandler */ CSV - Use symbolic constants <filename> (601) InitP11UartAndTimer /* Set up buffer size for rx and tx */ Retval &= (bool_a)SetupComm(ComHandle,1024,1024); /*BUFF_SIZE,BUFF_SIZE);*/ 17 SCM - Typical Metrics • graph theoretic complexity: based of the complexity of the program control flow represented by its cyclomatic number, • Halstead type metrics: based on the counting of the number of operators and operands, • calling relationship: based on the number of ways to activate a certain software module. SCM - Measurement Approach Taken • Measuring complexity attributes on each function • Comparing the values with threshold • Rating the functions according to the number of measures exceeding the thresholds 18 SCM - Complexity Metrics and Rating Id. Metrics Thresholds 50 STMT Number of executable statements AVGS Average size of statements CYCL Cyclomatic number 10 CALD Number of called functions 7 LEVL Maximum nesting level 5 DOPD Number of local variables 7 PARA Number of formal parameters 5 100 % 9.00 Excellent Good 75 % Fair 50 % Poor SCM - Overall Results 454 functions 16,5 67,3 SYSTEM (6939) 9,7 6,5 Excellent Good Fair Poor 83,3 COMP-1(806) 65,2 COMP-2 (6133) 0% 20% 17,4 40% 60% 80% 9,6 4,8 2,4 10,3 7,1 100% 19 SCM - COMP-1 sub-component (I) COMP-1 (6133) f_lib (31) 0,0 25,8 61,3 eaclib (10) 7,1 10,3 17,4 65,2 12,9 100,0 dz (119) cc (147) bsrtest (55) bsrlib (84) blceqdum (85) blceq (665) 14,5 70,6 as_main (6) 20% 40% 8,6 6,2 16,7 83,3 0% 7,5 7,4 14,1 13,7 64,8 audrive (337) 3,8 17,0 71,7 <FILE> (270) 10,7 22,6 11,9 54,9 blc (53) Poor 8,2 15,3 15,3 61,2 Fair 2,4 1,2 22,6 73,8 Excellent Good 7,3 7,3 32,7 52,7 4,1 17,0 17,0 61,9 6,5 14,0 19,6 59,8 12,6 9,2 16,8 61,3 domain (107) 60% 80% 100% CFA - Analysis Points • lack of processing hierarchy, • code duplication, • knotted code (use of unconditional branching statement), • inaccessible statement, • lack of code parameterisation, • auxiliary exit point. 20 CFA - Lack of Processing Hierarchy ~ 2000 statements > 50 local variables <file>.c <function> CFA - Lack of Processing Factorisation <file>.c <function> 21 CFA - Unknotted Flow <file>.c <function> DFA - Data Flow Analysis • The aim of data flow analysis is to detect poor and potentially incorrect program structures • Static analysis (tool-based) of source code based on information from control flow analysis and determination of when variables are written and read: – read before write – multiple writes with no intermediate read – written, but never read 22 DFA - Overall Results Id. Programming conventions COMP-1 COMP-2 - All local variables shall be initialised. 0 0 RU03 A pointer shall always be initialised. 27 50 Declaration and initialisation shall be done separately. 513 5831 RU15 All formal parameters shall be used. 164 266 RU04 All local variables shall be used. 147 66 - The value of an expression shall be the same under any order of evaluation. 0 0 RC03 Floating point variables shall not be tested for exact equality or inequality. 0 0 RC05 A for counter shall not be modified inside a loop. 14 8 RU06 Floating point variables shall not be used as loop counters. 0 0 RU10 The result of a function shall always be used 1280 5953 DFA - Modifying for counter in loop <file>.c (1355) <function> for (inx ...) { for (Inx ... {} inx = b + 1; } Also, the same name is used with different capitalisation 23 SDM - Self-Descriptiveness Measurement • Approach: # lines of comments – Measure the Comment Rate of each function= # executable statements – Compare Comment Rate with thresholds according to the size: Function Size Minimum Satisfactory Optimal Less or equal to 1 statement 0.00 0.00 0.50 Between 2 and 4 statements 0.00 0.25 0.50 Between 5 and 50 statements 0.25 0.25 0.50 More than 50 statements 0.25 0.50 0.50 – Rate the functions: Minimum Poor Satisfactory Fair Optimal Good Excellent SDM - Overall Results 39,7 <SYSTEM> (6939) 26,2 25,2 8,9 Excellent Good Fair Poor 58,6 COMP-1(806) 15,6 37,2 COMP-2 (6133) 0% 20% 27,6 40% 6,7 26,0 9,1 60% 19,1 80% 100% 24 Evaluation Conclusion - Strong points • A regular usage of function prototypes • A systematic initialisation of variables Evaluation Conclusion - Weak points • A poorly structured control flow • Extensive and inconsistent use of dynamic memory allocation • Some bugs / risky constructions • Little evidence of standardised coding practices • A significant percentage of complex components in the COMP-2 component • Some duplication of components • Some unnecessary data visibility • A poor self descriptiveness of some functions 25 Recommended Actions • Define a coding standard for new code • Bring old code in line with coding standard – gradually – based on criticality (e.g. from SFMEA) • • • • • • correct bugs ensure consistent use of memory allocation move duplicated components to common library improve encapsulation improve structuredness simplify extremely complex functions Litteratur [Brooks 1987] F.P.Brooks, No silver bullet, IEEE Computer 20(4): 10-19, 1987. [DO 178-B] RTCA/EUROCAE, Software Considerations in Airborne Systems and Equipment Certification, DO-178B/ED-12B. [Fenton 1997] N.Fenton and S.L.Pfleeger, Software Metrics: A Rigorous and Practical Approach, International Thomson Computer Press, 1997. [IEC 61508] IEC, Functional Safety of Electrical/Electronic/Programmable Electronic Safety-Related Systems, IEC 61508, Parts 1 to 7. [ISO 9126] ISO/IEC, Software Engineering - Product quality - Part 1:Quality Model, ISO/IEC 9126-1, 2001. [ISO 14598-5] ISO/IEC JTC1, Software Product Evaluation - Part 5:Process for evaluations, ISO/IEC 14598-5, 1998. [Voas 1997] J.Voas, Can Clean Pipes Produce Dirty Water, IEEE Software 14(4), pp. 93-95, July /August 1997. 26 SLUTT på foredraget 27