[{"data":1,"prerenderedAt":524},["ShallowReactive",2],{"global-navigation":3,"page-\u002Fsei-cert-fortran-coding-standard\u002Fmiscellaneous-msc\u002Fmsc02-f":31,"surround-\u002Fsei-cert-fortran-coding-standard\u002Fmiscellaneous-msc\u002Fmsc02-f":330,"sidebar-sei-cert-fortran-coding-standard":339},[4,8],{"title":5,"path":6,"_path":6,"fromAppConfig":7},"Home","\u002F",true,{"title":9,"path":10,"children":11,"_path":30,"fromAppConfig":7},"Coding Standards","\u002Fcoding-standards\u002F",[12,15,18,21,24,27],{"title":13,"path":14},"Android Coding Standard","\u002Fandroid-secure-coding-standard\u002F",{"title":16,"path":17},"C Coding Standard","\u002Fsei-cert-c-coding-standard\u002F",{"title":19,"path":20},"C++ Coding Standard","\u002Fsei-cert-cpp-coding-standard\u002F",{"title":22,"path":23},"Fortran Coding Standard","\u002Fsei-cert-fortran-coding-standard\u002F",{"title":25,"path":26},"Java Coding Standard","\u002Fsei-cert-oracle-coding-standard-for-java\u002F",{"title":28,"path":29},"Perl Coding Standard","\u002Fsei-cert-perl-coding-standard\u002F","\u002Fcoding-standards",{"id":32,"title":33,"body":34,"description":44,"extension":324,"meta":325,"navigation":7,"path":326,"seo":327,"stem":328,"__hash__":329},"content\u002F9.sei-cert-fortran-coding-standard\u002F12.miscellaneous-msc\u002F3.msc02-f.md","MSC02-F. Beware of compiler-specific extensions",{"type":35,"value":36,"toc":318},"minimark",[37,41,45,48,51,56,68,131,135,141,184,188,191,254,257,280,284,314],[38,39,33],"h1",{"id":40},"msc02-f-beware-of-compiler-specific-extensions",[42,43,44],"p",{},"Compilers may provide specific extensions that enhance functionality and offer convenience for programmers. However, these extensions can significantly compromise code portability and consistency across different development environments, creating challenges for maintenance and future development.",[42,46,47],{},"Even when multiple compilers support an extension, its behavior may differ, since the Fortran standard does not govern these features. Consequently, Fortran code relying on compiler-specific extensions cannot be guaranteed to compile or behave consistently across all environments.",[42,49,50],{},"This issue is particularly relevant when maintaining or inheriting legacy code. If the original compiler is unsupported or unavailable, developers must port or refactor the code for modern compilers, increasing the complexity of maintenance tasks.",[52,53,55],"h2",{"id":54},"noncompliant-code-example","Noncompliant Code Example",[42,57,58,59,63,64,67],{},"In this compliant example, the array ",[60,61,62],"code",{},"z"," is declared with a size of 3. The ",[60,65,66],{},"DATA"," statement provides only two values. While some compilers may accept this (e.g., Intel's ifort), it violates the standard requirement that the number of values matches the number of array elements.",[69,70,72],"code-block",{"quality":71},"bad",[73,74,79],"pre",{"className":75,"code":76,"language":77,"meta":78,"style":78},"language-fortran shiki shiki-themes github-light-high-contrast github-dark-high-contrast monokai","program compiler_extension\n  implicit none\n  integer :: z(3)\n  ! Noncompliant: z has 3 elements, but only 2 values are provided\n  data z \u002F1,2\u002F\n\n  print *, \"z =\", z\nend program\n","fortran","",[60,80,81,89,95,101,107,113,119,125],{"__ignoreMap":78},[82,83,86],"span",{"class":84,"line":85},"line",1,[82,87,88],{},"program compiler_extension\n",[82,90,92],{"class":84,"line":91},2,[82,93,94],{},"  implicit none\n",[82,96,98],{"class":84,"line":97},3,[82,99,100],{},"  integer :: z(3)\n",[82,102,104],{"class":84,"line":103},4,[82,105,106],{},"  ! Noncompliant: z has 3 elements, but only 2 values are provided\n",[82,108,110],{"class":84,"line":109},5,[82,111,112],{},"  data z \u002F1,2\u002F\n",[82,114,116],{"class":84,"line":115},6,[82,117,118],{"emptyLinePlaceholder":7},"\n",[82,120,122],{"class":84,"line":121},7,[82,123,124],{},"  print *, \"z =\", z\n",[82,126,128],{"class":84,"line":127},8,[82,129,130],{},"end program\n",[52,132,134],{"id":133},"compliant-solution","Compliant Solution",[42,136,137,138,140],{},"In this compliant solution, the initialization is performed using a standard array constructor in an assignment statement. This ensures the code is portable and the standard explicitly defines the behavior. Alternatively, a ",[60,139,66],{}," statement could be used if exactly three values were provided.",[69,142,144],{"quality":143},"good",[73,145,147],{"className":75,"code":146,"language":77,"meta":78,"style":78},"program compliant_extension\n  implicit none\n  integer :: z(3)\n\n  ! Compliant: Explicit assignment matches the aray rank and size.\n  z = (\u002F1, 2, 3\u002F)\n  print *, \"z =\", z\nend program\n",[60,148,149,154,158,162,166,171,176,180],{"__ignoreMap":78},[82,150,151],{"class":84,"line":85},[82,152,153],{},"program compliant_extension\n",[82,155,156],{"class":84,"line":91},[82,157,94],{},[82,159,160],{"class":84,"line":97},[82,161,100],{},[82,163,164],{"class":84,"line":103},[82,165,118],{"emptyLinePlaceholder":7},[82,167,168],{"class":84,"line":109},[82,169,170],{},"  ! Compliant: Explicit assignment matches the aray rank and size.\n",[82,172,173],{"class":84,"line":115},[82,174,175],{},"  z = (\u002F1, 2, 3\u002F)\n",[82,177,178],{"class":84,"line":121},[82,179,124],{},[82,181,182],{"class":84,"line":127},[82,183,130],{},[52,185,187],{"id":186},"risk-assessment","Risk Assessment",[42,189,190],{},"Relying on compiler extensions can lead to compilation errors when porting to other platforms.",[192,193,194,222],"table",{},[195,196,197],"thead",{},[198,199,200,204,207,210,213,216,219],"tr",{},[201,202,203],"th",{},"Rule",[201,205,206],{},"Severity",[201,208,209],{},"Likelihood",[201,211,212],{},"Detectable",[201,214,215],{},"Repairable",[201,217,218],{},"Priority",[201,220,221],{},"Level",[223,224,225],"tbody",{},[198,226,227,231,234,237,240,243,249],{},[228,229,230],"td",{},"MSC02-F",[228,232,233],{},"Medium",[228,235,236],{},"Likely",[228,238,239],{},"Yes",[228,241,242],{},"No",[228,244,245],{},[246,247,248],"strong",{},"P12",[228,250,251],{},[246,252,253],{},"L1",[255,256],"hr",{},[42,258,259,267,268,267,274],{},[260,261,263],"a",{"href":262},"\u002Fsei-cert-c-coding-standard\u002Frules\u002Fpreprocessor-pre\u002Fpre30-c",[264,265],"img",{"src":266},"attachments\u002F629047334\u002F638779635.png"," ",[260,269,271],{"href":270},"\u002Fsei-cert-c-coding-standard\u002Frules\u002Fpreprocessor-pre\u002F",[264,272],{"src":273},"attachments\u002F629047334\u002F638779636.png",[260,275,277],{"href":276},"\u002Fsei-cert-fortran-coding-standard\u002Ftypes-typ\u002Ftyp01-f",[264,278],{"src":279},"attachments\u002F629047334\u002F638779637.png",[52,281,283],{"id":282},"attachments","Attachments:",[285,286,290],"div",{"className":287,"align":289},[288],"greybox","left",[42,291,292,267,295,298,299,302,267,304,298,307,309,267,311,298],{},[264,293],{"alt":78,"src":294},"images\u002Ficons\u002Fbullet_blue.gif",[260,296,297],{"href":266},"button_arrow_left.png"," (image\u002Fpng)",[300,301],"br",{},[264,303],{"alt":78,"src":294},[260,305,306],{"href":273},"button_arrow_up.png",[300,308],{},[264,310],{"alt":78,"src":294},[260,312,313],{"href":279},"button_arrow_right.png",[315,316,317],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}html.sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}",{"title":78,"searchDepth":91,"depth":91,"links":319},[320,321,322,323],{"id":54,"depth":91,"text":55},{"id":133,"depth":91,"text":134},{"id":186,"depth":91,"text":187},{"id":282,"depth":91,"text":283},"md",{},"\u002Fsei-cert-fortran-coding-standard\u002Fmiscellaneous-msc\u002Fmsc02-f",{"title":33,"description":44},"9.sei-cert-fortran-coding-standard\u002F12.miscellaneous-msc\u002F3.msc02-f","KfGdyrFxHu3yhzI3x74RLejUSucLuNsb7niV7V_4iHc",[331,335],{"title":332,"path":333,"stem":334,"children":-1},"MSC01-F. Avoid using legacy or obsolescent Fortran constructs","\u002Fsei-cert-fortran-coding-standard\u002Fmiscellaneous-msc\u002Fmsc01-f","9.sei-cert-fortran-coding-standard\u002F12.miscellaneous-msc\u002F2.msc01-f",{"title":336,"path":337,"stem":338,"children":-1},"MSC03-F. Do not depend on undefined behavior","\u002Fsei-cert-fortran-coding-standard\u002Fmiscellaneous-msc\u002Fmsc03-f","9.sei-cert-fortran-coding-standard\u002F12.miscellaneous-msc\u002F4.msc03-f",[340],{"title":341,"path":342,"stem":343,"children":344},"Sei Cert Fortran Coding Standard","\u002Fsei-cert-fortran-coding-standard","9.sei-cert-fortran-coding-standard",[345,348,370,384,410,420,424,434,438,442,446,450,459,477,481,499,520],{"title":346,"path":342,"stem":347},"SEI CERT Fortran Coding Standard","9.sei-cert-fortran-coding-standard\u002F1.index",{"title":349,"path":350,"stem":351,"children":352},"Arrays (ARR)","\u002Fsei-cert-fortran-coding-standard\u002Farrays-arr","9.sei-cert-fortran-coding-standard\u002F02.arrays-arr\u002F1.index",[353,354,358,362,366],{"title":349,"path":350,"stem":351},{"title":355,"path":356,"stem":357},"ARR01-F. Do not use out-of-bounds arrays subscripts","\u002Fsei-cert-fortran-coding-standard\u002Farrays-arr\u002Farr01-f","9.sei-cert-fortran-coding-standard\u002F02.arrays-arr\u002F2.arr01-f",{"title":359,"path":360,"stem":361},"ARR02-F. Declare array dummy arguments as assumed-shape","\u002Fsei-cert-fortran-coding-standard\u002Farrays-arr\u002Farr02-f","9.sei-cert-fortran-coding-standard\u002F02.arrays-arr\u002F3.arr02-f",{"title":363,"path":364,"stem":365},"ARR03-F. Specify array bounds when copying data to device memory","\u002Fsei-cert-fortran-coding-standard\u002Farrays-arr\u002Farr03-f","9.sei-cert-fortran-coding-standard\u002F02.arrays-arr\u002F4.arr03-f",{"title":367,"path":368,"stem":369},"ARR04-F. Ensure arrays ranges mapped to devices cover all accessed elements","\u002Fsei-cert-fortran-coding-standard\u002Farrays-arr\u002Farr04-f","9.sei-cert-fortran-coding-standard\u002F02.arrays-arr\u002F5.arr04-f",{"title":371,"path":372,"stem":373,"children":374},"Attribute Declarations and Specifications (ADS)","\u002Fsei-cert-fortran-coding-standard\u002Fattribute-declarations-and-specifications-ads","9.sei-cert-fortran-coding-standard\u002F03.attribute-declarations-and-specifications-ads\u002F1.index",[375,376,380],{"title":371,"path":372,"stem":373},{"title":377,"path":378,"stem":379},"ADS01-F. Explicitly declare pure procedures","\u002Fsei-cert-fortran-coding-standard\u002Fattribute-declarations-and-specifications-ads\u002Fads01-f","9.sei-cert-fortran-coding-standard\u002F03.attribute-declarations-and-specifications-ads\u002F2.ads01-f",{"title":381,"path":382,"stem":383},"ADS02-F. Separate initialization from declaration to avoid implicit variable persistence","\u002Fsei-cert-fortran-coding-standard\u002Fattribute-declarations-and-specifications-ads\u002Fads02-f","9.sei-cert-fortran-coding-standard\u002F03.attribute-declarations-and-specifications-ads\u002F2.ads02-f",{"title":385,"path":386,"stem":387,"children":388},"Concurrency (CON)","\u002Fsei-cert-fortran-coding-standard\u002Fconcurrency-con","9.sei-cert-fortran-coding-standard\u002F04.concurrency-con\u002F1.index",[389,390,394,398,402,406],{"title":385,"path":386,"stem":387},{"title":391,"path":392,"stem":393},"CON01-F. Explicitly declare OpenMP data-sharing attributes for all variables","\u002Fsei-cert-fortran-coding-standard\u002Fconcurrency-con\u002Fcon01-f","9.sei-cert-fortran-coding-standard\u002F04.concurrency-con\u002F2.con01-f",{"title":395,"path":396,"stem":397},"CON02-F. Protect reduction variables in multithreaded code","\u002Fsei-cert-fortran-coding-standard\u002Fconcurrency-con\u002Fcon02-f","9.sei-cert-fortran-coding-standard\u002F04.concurrency-con\u002F3.con02-f",{"title":399,"path":400,"stem":401},"CON03-F. Protect multithreading recurrences to avoid data races","\u002Fsei-cert-fortran-coding-standard\u002Fconcurrency-con\u002Fcon03-f","9.sei-cert-fortran-coding-standard\u002F04.concurrency-con\u002F4.con03-f",{"title":403,"path":404,"stem":405},"CON04-F. Do not use out-of-dimension subscripts in multithreaded code","\u002Fsei-cert-fortran-coding-standard\u002Fconcurrency-con\u002Fcon04-f","9.sei-cert-fortran-coding-standard\u002F04.concurrency-con\u002F5.con04-f",{"title":407,"path":408,"stem":409},"CON05-F. Ensure correct OpenMP datascoping of variables in parallel regions","\u002Fsei-cert-fortran-coding-standard\u002Fconcurrency-con\u002Fcon05-f","9.sei-cert-fortran-coding-standard\u002F04.concurrency-con\u002F6.con05-f",{"title":411,"path":412,"stem":413,"children":414},"Exceptions and IEEE Arithmetic (EIA)","\u002Fsei-cert-fortran-coding-standard\u002Fexceptions-and-ieee-arithmetic-eia","9.sei-cert-fortran-coding-standard\u002F05.exceptions-and-ieee-arithmetic-eia\u002F1.index",[415,416],{"title":411,"path":412,"stem":413},{"title":417,"path":418,"stem":419},"EIA01-F. Enforce evaluation order in floating-point expressions","\u002Fsei-cert-fortran-coding-standard\u002Fexceptions-and-ieee-arithmetic-eia\u002Feia01-f","9.sei-cert-fortran-coding-standard\u002F05.exceptions-and-ieee-arithmetic-eia\u002F2.eia01-f",{"title":421,"path":422,"stem":423},"Execution Control (EXC)","\u002Fsei-cert-fortran-coding-standard\u002Fexecution-control-exc","9.sei-cert-fortran-coding-standard\u002F06.execution-control-exc",{"title":425,"path":426,"stem":427,"children":428},"Expressions and Assignment (EXA)","\u002Fsei-cert-fortran-coding-standard\u002Fexpressions-and-assignment-exa","9.sei-cert-fortran-coding-standard\u002F07.expressions-and-assignment-exa\u002F1.index",[429,430],{"title":425,"path":426,"stem":427},{"title":431,"path":432,"stem":433},"EXA01-F. Do not read uninitialized memory","\u002Fsei-cert-fortran-coding-standard\u002Fexpressions-and-assignment-exa\u002Fexa01-f","9.sei-cert-fortran-coding-standard\u002F07.expressions-and-assignment-exa\u002F2.exa01-f",{"title":435,"path":436,"stem":437},"Input and Output Editing (IOE)","\u002Fsei-cert-fortran-coding-standard\u002Finput-and-output-editing-ioe","9.sei-cert-fortran-coding-standard\u002F08.input-and-output-editing-ioe",{"title":439,"path":440,"stem":441},"Input and Output Statements (IOS)","\u002Fsei-cert-fortran-coding-standard\u002Finput-and-output-statements-ios","9.sei-cert-fortran-coding-standard\u002F09.input-and-output-statements-ios",{"title":443,"path":444,"stem":445},"Interoperability with C (IWC)","\u002Fsei-cert-fortran-coding-standard\u002Finteroperability-with-c-iwc","9.sei-cert-fortran-coding-standard\u002F10.interoperability-with-c-iwc",{"title":447,"path":448,"stem":449},"Intrinsic Procedures and Modules (IPM)","\u002Fsei-cert-fortran-coding-standard\u002Fintrinsic-procedures-and-modules-ipm","9.sei-cert-fortran-coding-standard\u002F11.intrinsic-procedures-and-modules-ipm",{"title":451,"path":452,"stem":453,"children":454},"Miscellaneous (MSC)","\u002Fsei-cert-fortran-coding-standard\u002Fmiscellaneous-msc","9.sei-cert-fortran-coding-standard\u002F12.miscellaneous-msc\u002F1.index",[455,456,457,458],{"title":451,"path":452,"stem":453},{"title":332,"path":333,"stem":334},{"title":33,"path":326,"stem":328},{"title":336,"path":337,"stem":338},{"title":460,"path":461,"stem":462,"children":463},"Procedures (PRC)","\u002Fsei-cert-fortran-coding-standard\u002Fprocedures-prc","9.sei-cert-fortran-coding-standard\u002F13.procedures-prc\u002F1.index",[464,465,469,473],{"title":460,"path":461,"stem":462},{"title":466,"path":467,"stem":468},"PRC01-F. Disable the implicit declaration of procedures","\u002Fsei-cert-fortran-coding-standard\u002Fprocedures-prc\u002Fprc01-f","9.sei-cert-fortran-coding-standard\u002F13.procedures-prc\u002F2.prc01-f",{"title":470,"path":471,"stem":472},"PRC02-F. Avoid implicit interfaces by using module procedures","\u002Fsei-cert-fortran-coding-standard\u002Fprocedures-prc\u002Fprc02-f","9.sei-cert-fortran-coding-standard\u002F13.procedures-prc\u002F3.prc02-f",{"title":474,"path":475,"stem":476},"PRC03-F. Declare the intent for all dummy arguments","\u002Fsei-cert-fortran-coding-standard\u002Fprocedures-prc\u002Fprc03-f","9.sei-cert-fortran-coding-standard\u002F13.procedures-prc\u002F4.prc03-f",{"title":478,"path":479,"stem":480},"Program Units (PRU)","\u002Fsei-cert-fortran-coding-standard\u002Fprogram-units-pru","9.sei-cert-fortran-coding-standard\u002F14.program-units-pru",{"title":482,"path":483,"stem":484,"children":485},"Scope, Association, and Definition (SAD)","\u002Fsei-cert-fortran-coding-standard\u002Fscope-association-and-definition-sad","9.sei-cert-fortran-coding-standard\u002F15.scope-association-and-definition-sad\u002F1.index",[486,487,491,495],{"title":482,"path":483,"stem":484},{"title":488,"path":489,"stem":490},"SAD02-F. Minimize imported module entities using the ONLY clause","\u002Fsei-cert-fortran-coding-standard\u002Fscope-association-and-definition-sad\u002Fsad02-f","9.sei-cert-fortran-coding-standard\u002F15.scope-association-and-definition-sad\u002F2.sad02-f",{"title":492,"path":493,"stem":494},"SAD03-F. Replace common block with modules for safer data encapsulation","\u002Fsei-cert-fortran-coding-standard\u002Fscope-association-and-definition-sad\u002Fsad03-f","9.sei-cert-fortran-coding-standard\u002F15.scope-association-and-definition-sad\u002F3.sad03-f",{"title":496,"path":497,"stem":498},"Limit the scope of variables and procedures","\u002Fsei-cert-fortran-coding-standard\u002Fscope-association-and-definition-sad\u002Flimit-the-scope-of-variables-and-procedures","9.sei-cert-fortran-coding-standard\u002F15.scope-association-and-definition-sad\u002F4.limit-the-scope-of-variables-and-procedures",{"title":500,"path":501,"stem":502,"children":503},"Types (TYP)","\u002Fsei-cert-fortran-coding-standard\u002Ftypes-typ","9.sei-cert-fortran-coding-standard\u002F16.types-typ\u002F1.index",[504,505,508,512,516],{"title":500,"path":501,"stem":502},{"title":506,"path":276,"stem":507},"TYP01-F. Use Intrinsic Assignment for Character Entities","9.sei-cert-fortran-coding-standard\u002F16.types-typ\u002F2.typ01-f",{"title":509,"path":510,"stem":511},"TYP02-F. Prohibit implicit typing in all program units","\u002Fsei-cert-fortran-coding-standard\u002Ftypes-typ\u002Ftyp02-f","9.sei-cert-fortran-coding-standard\u002F16.types-typ\u002F3.typ02-f",{"title":513,"path":514,"stem":515},"TYP03-F. Ensure intrinsic function arguments match intended precision","\u002Fsei-cert-fortran-coding-standard\u002Ftypes-typ\u002Ftyp03-f","9.sei-cert-fortran-coding-standard\u002F16.types-typ\u002F4.typ03-f",{"title":517,"path":518,"stem":519},"TYP04-F. Centralize kind definitions to ensure consistent precision","\u002Fsei-cert-fortran-coding-standard\u002Ftypes-typ\u002Ftyp04-f","9.sei-cert-fortran-coding-standard\u002F16.types-typ\u002F5.typ04-f",{"title":521,"path":522,"stem":523},"Acknowledgments","\u002Fsei-cert-fortran-coding-standard\u002Facknowledgements","9.sei-cert-fortran-coding-standard\u002Facknowledgements",1780320168391]