[{"data":1,"prerenderedAt":945},["ShallowReactive",2],{"global-navigation":3,"page-\u002Fsei-cert-fortran-coding-standard\u002Fguidelines\u002Fdeclarations-and-initialization-dcl\u002Fdcl05-f":31,"surround-\u002Fsei-cert-fortran-coding-standard\u002Fguidelines\u002Fdeclarations-and-initialization-dcl\u002Fdcl05-f":728,"sidebar-sei-cert-fortran-coding-standard":737},[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":722,"meta":723,"navigation":7,"path":724,"seo":725,"stem":726,"__hash__":727},"content\u002F9.sei-cert-fortran-coding-standard\u002F04.guidelines\u002F03.declarations-and-initialization-dcl\u002F2.dcl05-f.md","DCL05-F. Uninitialized output arguments can lead to undefined behavior",{"type":35,"value":36,"toc":714},"minimark",[37,41,45,57,60,63,66,84,89,92,400,415,420,431,463,470,500,503,507,514,523,568,572,575,653,676,680,710],[38,39,33],"h1",{"id":40},"dcl05-f-uninitialized-output-arguments-can-lead-to-undefined-behavior",[42,43,44],"p",{},"An output argument is not always initialized before the procedure returns to\nthe caller. Its usage can cause undefined behavior due to its indeterminate\nstate.",[42,46,47,48,52,53,56],{},"To prevent bugs in the code, ensure the problematic output arguments are set in\nall possible code paths. In case of conditionality, it may help to add explicit\n",[49,50,51],"code",{},"else"," or ",[49,54,55],{},"default"," branches in control-flow blocks, or even set default\ninitial values at the start of the procedure.",[42,58,59],{},"Some programming languages automatically initialize variables to default\nvalues, but Fortran does not.",[42,61,62],{},"More specifically, variables not explicitly initialized contain unpredictable\ndata, and reading and using them results in undefined behavior, potentially\ncausing incorrect results, crashes, or other unintended outcomes. Compilers are\nnot required to warn about these issues and, even if they do, they typically\nstill allow the code to compile and run.",[42,64,65],{},"Some compilers may appear to \"help\" by zero-initializing variables under\ncertain conditions (e.g., specific compilation flags). While this can make\ntechnically incorrect code run as originally intended, relying on such\nincidental behavior creates a false sense of security and masks underlying\nlogical errors. However, this apparent safety can vanish under different\ncompilation settings and can vary between compilers.",[42,67,68,69,72,73,52,76,79,80,83],{},"Lastly, while some compilers provide options to automatically initialize\ncertain data types (e.g., ",[49,70,71],{},"gfortran","'s ",[49,74,75],{},"-finit-integer=\u003Cvalue>",[49,77,78],{},"gcc","'s\n",[49,81,82],{},"-ftrivial-auto-var-init=\u003Cvalue>","), these features reduce portability to other\ndevelopment environments and hide problems in the code rather than addressing\nthem.",[85,86,88],"h2",{"id":87},"noncompliant-code-example","Noncompliant Code Example",[42,90,91],{},"Consider the following code, which computes statistics from a series of data\npoints:",[93,94,96],"code-block",{"quality":95},"bad",[97,98,103],"pre",{"className":99,"code":100,"language":101,"meta":102,"style":102},"language-fortran shiki shiki-themes github-light-high-contrast github-dark-high-contrast monokai","! example.f90\n\nmodule StatsMod\n  use iso_fortran_env, only: real32\n  implicit none\n  private\n\n  public :: computeStats, statsType\n\n  type :: statsType\n    real(kind=real32) :: mean\n    real(kind=real32) :: stddev\n  end type statsType\n\ncontains\n\n  pure subroutine computeStats(data, result)\n    real(kind=real32), intent(in) :: data(:)\n    type(statsType), intent(out) :: result\n\n    integer :: i, len\n\n    ! We can't compute stddev from a single data point\n    len = size(data)\n    if (len \u003C= 1) then\n      return\n    end if\n\n    ! Also abort if there are invalid data points\n    do i = 1, len\n      if (data(i) \u003C -900.0) then\n        return\n      end if\n    end do\n\n    result%mean = sum(data) \u002F len\n    result%stddev = sqrt(sum((data - result%mean)**2) \u002F (len - 1))\n  end subroutine computeStats\nend module StatsMod\n\nprogram main\n  use iso_fortran_env, only: real32\n  use StatsMod, only: computeStats, statsType\n  implicit none\n\n  real(kind=real32), dimension(5) :: sensorData = [1.0, -999.0, 3.0, 5.0, 7.0]\n  type(statsType) :: stats\n\n  call computeStats(sensorData, stats)\n  print '(A, F4.2, A, F4.2)', \"Mean = \", stats%mean, \" Stddev = \", stats%stddev\nend program main\n","fortran","",[49,104,105,113,119,125,131,137,143,148,154,159,165,171,177,183,188,194,199,205,211,217,222,228,233,239,245,251,257,263,268,274,280,286,292,298,304,309,315,321,327,333,338,344,349,355,360,365,371,377,382,388,394],{"__ignoreMap":102},[106,107,110],"span",{"class":108,"line":109},"line",1,[106,111,112],{},"! example.f90\n",[106,114,116],{"class":108,"line":115},2,[106,117,118],{"emptyLinePlaceholder":7},"\n",[106,120,122],{"class":108,"line":121},3,[106,123,124],{},"module StatsMod\n",[106,126,128],{"class":108,"line":127},4,[106,129,130],{},"  use iso_fortran_env, only: real32\n",[106,132,134],{"class":108,"line":133},5,[106,135,136],{},"  implicit none\n",[106,138,140],{"class":108,"line":139},6,[106,141,142],{},"  private\n",[106,144,146],{"class":108,"line":145},7,[106,147,118],{"emptyLinePlaceholder":7},[106,149,151],{"class":108,"line":150},8,[106,152,153],{},"  public :: computeStats, statsType\n",[106,155,157],{"class":108,"line":156},9,[106,158,118],{"emptyLinePlaceholder":7},[106,160,162],{"class":108,"line":161},10,[106,163,164],{},"  type :: statsType\n",[106,166,168],{"class":108,"line":167},11,[106,169,170],{},"    real(kind=real32) :: mean\n",[106,172,174],{"class":108,"line":173},12,[106,175,176],{},"    real(kind=real32) :: stddev\n",[106,178,180],{"class":108,"line":179},13,[106,181,182],{},"  end type statsType\n",[106,184,186],{"class":108,"line":185},14,[106,187,118],{"emptyLinePlaceholder":7},[106,189,191],{"class":108,"line":190},15,[106,192,193],{},"contains\n",[106,195,197],{"class":108,"line":196},16,[106,198,118],{"emptyLinePlaceholder":7},[106,200,202],{"class":108,"line":201},17,[106,203,204],{},"  pure subroutine computeStats(data, result)\n",[106,206,208],{"class":108,"line":207},18,[106,209,210],{},"    real(kind=real32), intent(in) :: data(:)\n",[106,212,214],{"class":108,"line":213},19,[106,215,216],{},"    type(statsType), intent(out) :: result\n",[106,218,220],{"class":108,"line":219},20,[106,221,118],{"emptyLinePlaceholder":7},[106,223,225],{"class":108,"line":224},21,[106,226,227],{},"    integer :: i, len\n",[106,229,231],{"class":108,"line":230},22,[106,232,118],{"emptyLinePlaceholder":7},[106,234,236],{"class":108,"line":235},23,[106,237,238],{},"    ! We can't compute stddev from a single data point\n",[106,240,242],{"class":108,"line":241},24,[106,243,244],{},"    len = size(data)\n",[106,246,248],{"class":108,"line":247},25,[106,249,250],{},"    if (len \u003C= 1) then\n",[106,252,254],{"class":108,"line":253},26,[106,255,256],{},"      return\n",[106,258,260],{"class":108,"line":259},27,[106,261,262],{},"    end if\n",[106,264,266],{"class":108,"line":265},28,[106,267,118],{"emptyLinePlaceholder":7},[106,269,271],{"class":108,"line":270},29,[106,272,273],{},"    ! Also abort if there are invalid data points\n",[106,275,277],{"class":108,"line":276},30,[106,278,279],{},"    do i = 1, len\n",[106,281,283],{"class":108,"line":282},31,[106,284,285],{},"      if (data(i) \u003C -900.0) then\n",[106,287,289],{"class":108,"line":288},32,[106,290,291],{},"        return\n",[106,293,295],{"class":108,"line":294},33,[106,296,297],{},"      end if\n",[106,299,301],{"class":108,"line":300},34,[106,302,303],{},"    end do\n",[106,305,307],{"class":108,"line":306},35,[106,308,118],{"emptyLinePlaceholder":7},[106,310,312],{"class":108,"line":311},36,[106,313,314],{},"    result%mean = sum(data) \u002F len\n",[106,316,318],{"class":108,"line":317},37,[106,319,320],{},"    result%stddev = sqrt(sum((data - result%mean)**2) \u002F (len - 1))\n",[106,322,324],{"class":108,"line":323},38,[106,325,326],{},"  end subroutine computeStats\n",[106,328,330],{"class":108,"line":329},39,[106,331,332],{},"end module StatsMod\n",[106,334,336],{"class":108,"line":335},40,[106,337,118],{"emptyLinePlaceholder":7},[106,339,341],{"class":108,"line":340},41,[106,342,343],{},"program main\n",[106,345,347],{"class":108,"line":346},42,[106,348,130],{},[106,350,352],{"class":108,"line":351},43,[106,353,354],{},"  use StatsMod, only: computeStats, statsType\n",[106,356,358],{"class":108,"line":357},44,[106,359,136],{},[106,361,363],{"class":108,"line":362},45,[106,364,118],{"emptyLinePlaceholder":7},[106,366,368],{"class":108,"line":367},46,[106,369,370],{},"  real(kind=real32), dimension(5) :: sensorData = [1.0, -999.0, 3.0, 5.0, 7.0]\n",[106,372,374],{"class":108,"line":373},47,[106,375,376],{},"  type(statsType) :: stats\n",[106,378,380],{"class":108,"line":379},48,[106,381,118],{"emptyLinePlaceholder":7},[106,383,385],{"class":108,"line":384},49,[106,386,387],{},"  call computeStats(sensorData, stats)\n",[106,389,391],{"class":108,"line":390},50,[106,392,393],{},"  print '(A, F4.2, A, F4.2)', \"Mean = \", stats%mean, \" Stddev = \", stats%stddev\n",[106,395,397],{"class":108,"line":396},51,[106,398,399],{},"end program main\n",[42,401,402,403,406,407,410,411,414],{},"Note how ",[49,404,405],{},"computeStats()"," terminates early if certain requirements aren't met.\nAs a result, these early exists prevent ",[49,408,409],{},"result"," from being initialized, even\nthough the caller expects to always obtain a valid result. Since the Fortran\nstandard does not guarantee any default initialization for variables, the state\nof ",[49,412,413],{},"stats"," in this scenario is indeterminate, leading to different outcomes\ndepending on the compiler settings.",[416,417,419],"h3",{"id":418},"implementation-details-unix","Implementation Details (Unix)",[42,421,422,423,426,427,430],{},"Consider the following compiler settings that produce different results. For instance, ",[49,424,425],{},"gfortran -O2"," appears to start the stats at ",[49,428,429],{},"0",":",[97,432,436],{"className":433,"code":434,"language":435,"meta":102,"style":102},"language-txt shiki shiki-themes github-light-high-contrast github-dark-high-contrast monokai","$ gfortran --version\nGNU Fortran (Ubuntu 13.3.0-6ubuntu2~24.04) 13.3.0\n$ gfortran -O2 example.f90 -o example_gfortran\n$ .\u002Fexample_gfortran \nMean = 0.00 Stddev = 0.00\n","txt",[49,437,438,443,448,453,458],{"__ignoreMap":102},[106,439,440],{"class":108,"line":109},[106,441,442],{},"$ gfortran --version\n",[106,444,445],{"class":108,"line":115},[106,446,447],{},"GNU Fortran (Ubuntu 13.3.0-6ubuntu2~24.04) 13.3.0\n",[106,449,450],{"class":108,"line":121},[106,451,452],{},"$ gfortran -O2 example.f90 -o example_gfortran\n",[106,454,455],{"class":108,"line":127},[106,456,457],{},"$ .\u002Fexample_gfortran \n",[106,459,460],{"class":108,"line":133},[106,461,462],{},"Mean = 0.00 Stddev = 0.00\n",[42,464,465,466,469],{},"However, with ",[49,467,468],{},"flang -O2",", the stats seem to contain arbitrary data:",[97,471,473],{"className":433,"code":472,"language":435,"meta":102,"style":102},"$ flang-new --version\nUbuntu flang-new version 18.1.3 (1ubuntu1)\n$ flang-new -O2 example.f90 -o example_flang\n$ .\u002Fexample_flang \nMean = **** Stddev = ****\n",[49,474,475,480,485,490,495],{"__ignoreMap":102},[106,476,477],{"class":108,"line":109},[106,478,479],{},"$ flang-new --version\n",[106,481,482],{"class":108,"line":115},[106,483,484],{},"Ubuntu flang-new version 18.1.3 (1ubuntu1)\n",[106,486,487],{"class":108,"line":121},[106,488,489],{},"$ flang-new -O2 example.f90 -o example_flang\n",[106,491,492],{"class":108,"line":127},[106,493,494],{},"$ .\u002Fexample_flang \n",[106,496,497],{"class":108,"line":133},[106,498,499],{},"Mean = **** Stddev = ****\n",[42,501,502],{},"It is important to note that each compiler is not necessarily choosing specific\ninitial values for the stats. Instead, an undefined behavior means the outcome\nof the code is always unpredictable, and could even lead to crashes; in fact,\nthese compilers could also behave differently under other compilation settings.\nUltimately, code with undefined behavior should never be relied upon.",[85,504,506],{"id":505},"compliant-solution","Compliant Solution",[42,508,509,510,513],{},"To prevent these problems, we must always initialize output arguments in all\npossible code paths to comply with the expectations of the caller. This\nprinciple applies to all variable types, including elemental types like\n",[49,511,512],{},"integer",", derived types, and arrays.",[42,515,516,517,519,520,522],{},"There are multiple ways to solve the bug. For example, we can simply initialize\n",[49,518,409],{}," with default values at the start of ",[49,521,405],{},", ensuring it is\nalways defined for the caller, regardless of whether the rest of the procedure\ncan execute or not:",[93,524,526],{"quality":525},"good",[97,527,529],{"className":99,"code":528,"language":101,"meta":102,"style":102},"! solution.f90\n\ntype(statsType), intent(out) :: result\n\n! \u003C...>\n\nresult%mean = 0.0\nresult%stddev = 0.0\n",[49,530,531,536,540,545,549,554,558,563],{"__ignoreMap":102},[106,532,533],{"class":108,"line":109},[106,534,535],{},"! solution.f90\n",[106,537,538],{"class":108,"line":115},[106,539,118],{"emptyLinePlaceholder":7},[106,541,542],{"class":108,"line":121},[106,543,544],{},"type(statsType), intent(out) :: result\n",[106,546,547],{"class":108,"line":127},[106,548,118],{"emptyLinePlaceholder":7},[106,550,551],{"class":108,"line":133},[106,552,553],{},"! \u003C...>\n",[106,555,556],{"class":108,"line":139},[106,557,118],{"emptyLinePlaceholder":7},[106,559,560],{"class":108,"line":145},[106,561,562],{},"result%mean = 0.0\n",[106,564,565],{"class":108,"line":150},[106,566,567],{},"result%stddev = 0.0\n",[85,569,571],{"id":570},"risk-assessment","Risk Assessment",[42,573,574],{},"Undefined behavior can produce incorrect results, silent data corruption, crashes, or nondeterministic behavior that varies across compilers or platforms. Programmers should ensure that the code avoids undefined behavior in all cases.",[576,577,578,599],"table",{},[579,580,581],"thead",{},[582,583,584,587,589,591,593,595,597],"tr",{},[585,586],"th",{},[585,588],{},[585,590],{},[585,592],{},[585,594],{},[585,596],{},[585,598],{},[600,601,602,626],"tbody",{},[582,603,604,608,611,614,617,620,623],{},[605,606,607],"td",{},"Recommendation",[605,609,610],{},"Severity",[605,612,613],{},"Likelihood",[605,615,616],{},"Detectable",[605,618,619],{},"Repairable",[605,621,622],{},"Priority",[605,624,625],{},"Level",[582,627,628,631,634,637,640,642,648],{},[605,629,630],{},"DCL05-F",[605,632,633],{},"High",[605,635,636],{},"Likely",[605,638,639],{},"Yes",[605,641,639],{},[605,643,644],{},[645,646,647],"strong",{},"P27",[605,649,650],{},[645,651,652],{},"L1",[42,654,655,663,664,663,670],{},[656,657,659],"a",{"href":658},"\u002Fsei-cert-c-coding-standard\u002Frules\u002Fpreprocessor-pre\u002Fpre30-c",[660,661],"img",{"src":662},"attachments\u002F629047330\u002F638779511.png"," ",[656,665,667],{"href":666},"\u002Fsei-cert-c-coding-standard\u002Frules\u002Fpreprocessor-pre\u002F",[660,668],{"src":669},"attachments\u002F629047330\u002F638779512.png",[656,671,673],{"href":672},"\u002Fsei-cert-fortran-coding-standard\u002Ftypes-typ\u002Ftyp01-f",[660,674],{"src":675},"attachments\u002F629047330\u002F638779513.png",[85,677,679],{"id":678},"attachments","Attachments:",[681,682,686],"div",{"className":683,"align":685},[684],"greybox","left",[42,687,688,663,691,694,695,698,663,700,694,703,705,663,707,694],{},[660,689],{"alt":102,"src":690},"images\u002Ficons\u002Fbullet_blue.gif",[656,692,693],{"href":662},"button_arrow_left.png"," (image\u002Fpng)",[696,697],"br",{},[660,699],{"alt":102,"src":690},[656,701,702],{"href":669},"button_arrow_up.png",[696,704],{},[660,706],{"alt":102,"src":690},[656,708,709],{"href":675},"button_arrow_right.png",[711,712,713],"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":102,"searchDepth":115,"depth":115,"links":715},[716,719,720,721],{"id":87,"depth":115,"text":88,"children":717},[718],{"id":418,"depth":121,"text":419},{"id":505,"depth":115,"text":506},{"id":570,"depth":115,"text":571},{"id":678,"depth":115,"text":679},"md",{},"\u002Fsei-cert-fortran-coding-standard\u002Fguidelines\u002Fdeclarations-and-initialization-dcl\u002Fdcl05-f",{"title":33,"description":44},"9.sei-cert-fortran-coding-standard\u002F04.guidelines\u002F03.declarations-and-initialization-dcl\u002F2.dcl05-f","DduBWRdHch98ZEKB5KhxnCf7QXUxPwMIKR9jF6V3MEE",[729,733],{"title":730,"path":731,"stem":732,"children":-1},"DCL04-F. Conditionally initialized variables can lead to undefined behavior","\u002Fsei-cert-fortran-coding-standard\u002Fguidelines\u002Fdeclarations-and-initialization-dcl\u002Fdcl04-f","9.sei-cert-fortran-coding-standard\u002F04.guidelines\u002F03.declarations-and-initialization-dcl\u002F2.dcl04-f",{"title":734,"path":735,"stem":736,"children":-1},"Concurrency (CON)","\u002Fsei-cert-fortran-coding-standard\u002Fguidelines\u002Fconcurrency-con","9.sei-cert-fortran-coding-standard\u002F04.guidelines\u002F04.concurrency-con\u002F1.index",[738],{"title":739,"path":740,"stem":741,"children":742},"SEI CERT Fortran Coding Standard","\u002Fsei-cert-fortran-coding-standard","9.sei-cert-fortran-coding-standard\u002F01.index",[743,744,756,923,941],{"title":739,"path":740,"stem":741},{"title":745,"path":746,"stem":747,"children":748},"Front Matter","\u002Fsei-cert-fortran-coding-standard\u002Ffront-matter","9.sei-cert-fortran-coding-standard\u002F02.front-matter\u002F1.index",[749,750],{"title":745,"path":746,"stem":747},{"title":751,"path":752,"stem":753,"children":754},"Introduction","\u002Fsei-cert-fortran-coding-standard\u002Ffront-matter\u002Fintroduction","9.sei-cert-fortran-coding-standard\u002F02.front-matter\u002F2.introduction\u002F01.index",[755],{"title":751,"path":752,"stem":753},{"title":757,"path":758,"stem":759,"children":760},"Guidelines","\u002Fsei-cert-fortran-coding-standard\u002Fguidelines","9.sei-cert-fortran-coding-standard\u002F04.guidelines\u002F01.index",[761,762,784,804,827,837,847,865,883,901],{"title":757,"path":758,"stem":759},{"title":763,"path":764,"stem":765,"children":766},"Arrays (ARR)","\u002Fsei-cert-fortran-coding-standard\u002Fguidelines\u002Farrays-arr","9.sei-cert-fortran-coding-standard\u002F04.guidelines\u002F02.arrays-arr\u002F1.index",[767,768,772,776,780],{"title":763,"path":764,"stem":765},{"title":769,"path":770,"stem":771},"ARR01-F. Do not use out-of-bounds arrays subscripts","\u002Fsei-cert-fortran-coding-standard\u002Fguidelines\u002Farrays-arr\u002Farr01-f","9.sei-cert-fortran-coding-standard\u002F04.guidelines\u002F02.arrays-arr\u002F2.arr01-f",{"title":773,"path":774,"stem":775},"ARR02-F. Declare array dummy arguments as assumed-shape","\u002Fsei-cert-fortran-coding-standard\u002Fguidelines\u002Farrays-arr\u002Farr02-f","9.sei-cert-fortran-coding-standard\u002F04.guidelines\u002F02.arrays-arr\u002F3.arr02-f",{"title":777,"path":778,"stem":779},"ARR03-F. Specify array bounds when copying data to device memory","\u002Fsei-cert-fortran-coding-standard\u002Fguidelines\u002Farrays-arr\u002Farr03-f","9.sei-cert-fortran-coding-standard\u002F04.guidelines\u002F02.arrays-arr\u002F4.arr03-f",{"title":781,"path":782,"stem":783},"ARR04-F. Ensure arrays ranges mapped to devices cover all accessed elements","\u002Fsei-cert-fortran-coding-standard\u002Fguidelines\u002Farrays-arr\u002Farr04-f","9.sei-cert-fortran-coding-standard\u002F04.guidelines\u002F02.arrays-arr\u002F5.arr04-f",{"title":785,"path":786,"stem":787,"children":788},"Declarations and Initialization (DCL)","\u002Fsei-cert-fortran-coding-standard\u002Fguidelines\u002Fdeclarations-and-initialization-dcl","9.sei-cert-fortran-coding-standard\u002F04.guidelines\u002F03.declarations-and-initialization-dcl\u002F1.index",[789,790,794,798,802,803],{"title":785,"path":786,"stem":787},{"title":791,"path":792,"stem":793},"DCL01-F. Explicitly declare pure procedures","\u002Fsei-cert-fortran-coding-standard\u002Fguidelines\u002Fdeclarations-and-initialization-dcl\u002Fdcl01-f","9.sei-cert-fortran-coding-standard\u002F04.guidelines\u002F03.declarations-and-initialization-dcl\u002F2.dcl01-f",{"title":795,"path":796,"stem":797},"DCL02-F. Explicitly declare the 'save' attribute or split the variable initialization to prevent unintended behavior","\u002Fsei-cert-fortran-coding-standard\u002Fguidelines\u002Fdeclarations-and-initialization-dcl\u002Fdcl02-f","9.sei-cert-fortran-coding-standard\u002F04.guidelines\u002F03.declarations-and-initialization-dcl\u002F2.dcl02-f",{"title":799,"path":800,"stem":801},"DCL03-F. Avoid undefined behavior due to uninitialized variables","\u002Fsei-cert-fortran-coding-standard\u002Fguidelines\u002Fdeclarations-and-initialization-dcl\u002Fdcl03-f","9.sei-cert-fortran-coding-standard\u002F04.guidelines\u002F03.declarations-and-initialization-dcl\u002F2.dcl03-f",{"title":730,"path":731,"stem":732},{"title":33,"path":724,"stem":726},{"title":734,"path":735,"stem":736,"children":805},[806,807,811,815,819,823],{"title":734,"path":735,"stem":736},{"title":808,"path":809,"stem":810},"CON01-F. Explicitly declare OpenMP data-sharing attributes for all variables","\u002Fsei-cert-fortran-coding-standard\u002Fguidelines\u002Fconcurrency-con\u002Fcon01-f","9.sei-cert-fortran-coding-standard\u002F04.guidelines\u002F04.concurrency-con\u002F2.con01-f",{"title":812,"path":813,"stem":814},"CON02-F. Protect reduction variables in multithreaded code","\u002Fsei-cert-fortran-coding-standard\u002Fguidelines\u002Fconcurrency-con\u002Fcon02-f","9.sei-cert-fortran-coding-standard\u002F04.guidelines\u002F04.concurrency-con\u002F3.con02-f",{"title":816,"path":817,"stem":818},"CON03-F. Protect multithreading recurrences to avoid data races","\u002Fsei-cert-fortran-coding-standard\u002Fguidelines\u002Fconcurrency-con\u002Fcon03-f","9.sei-cert-fortran-coding-standard\u002F04.guidelines\u002F04.concurrency-con\u002F4.con03-f",{"title":820,"path":821,"stem":822},"CON04-F. Do not use out-of-dimension subscripts in multithreaded code","\u002Fsei-cert-fortran-coding-standard\u002Fguidelines\u002Fconcurrency-con\u002Fcon04-f","9.sei-cert-fortran-coding-standard\u002F04.guidelines\u002F04.concurrency-con\u002F5.con04-f",{"title":824,"path":825,"stem":826},"CON05-F. Ensure correct OpenMP datascoping of variables in parallel regions","\u002Fsei-cert-fortran-coding-standard\u002Fguidelines\u002Fconcurrency-con\u002Fcon05-f","9.sei-cert-fortran-coding-standard\u002F04.guidelines\u002F04.concurrency-con\u002F6.con05-f",{"title":828,"path":829,"stem":830,"children":831},"Exceptions and IEEE Arithmetic (EIA)","\u002Fsei-cert-fortran-coding-standard\u002Fguidelines\u002Fexceptions-and-ieee-arithmetic-eia","9.sei-cert-fortran-coding-standard\u002F04.guidelines\u002F05.exceptions-and-ieee-arithmetic-eia\u002F1.index",[832,833],{"title":828,"path":829,"stem":830},{"title":834,"path":835,"stem":836},"EIA01-F. Enforce evaluation order in floating-point expressions","\u002Fsei-cert-fortran-coding-standard\u002Fguidelines\u002Fexceptions-and-ieee-arithmetic-eia\u002Feia01-f","9.sei-cert-fortran-coding-standard\u002F04.guidelines\u002F05.exceptions-and-ieee-arithmetic-eia\u002F2.eia01-f",{"title":838,"path":839,"stem":840,"children":841},"Expressions and Assignment (EXA)","\u002Fsei-cert-fortran-coding-standard\u002Fguidelines\u002Fexpressions-and-assignment-exa","9.sei-cert-fortran-coding-standard\u002F04.guidelines\u002F07.expressions-and-assignment-exa\u002F1.index",[842,843],{"title":838,"path":839,"stem":840},{"title":844,"path":845,"stem":846},"EXA01-F. Do not read uninitialized memory","\u002Fsei-cert-fortran-coding-standard\u002Fguidelines\u002Fexpressions-and-assignment-exa\u002Fexa01-f","9.sei-cert-fortran-coding-standard\u002F04.guidelines\u002F07.expressions-and-assignment-exa\u002F2.exa01-f",{"title":848,"path":849,"stem":850,"children":851},"Miscellaneous (MSC)","\u002Fsei-cert-fortran-coding-standard\u002Fguidelines\u002Fmiscellaneous-msc","9.sei-cert-fortran-coding-standard\u002F04.guidelines\u002F12.miscellaneous-msc\u002F1.index",[852,853,857,861],{"title":848,"path":849,"stem":850},{"title":854,"path":855,"stem":856},"MSC01-F. Avoid using legacy or obsolescent Fortran constructs","\u002Fsei-cert-fortran-coding-standard\u002Fguidelines\u002Fmiscellaneous-msc\u002Fmsc01-f","9.sei-cert-fortran-coding-standard\u002F04.guidelines\u002F12.miscellaneous-msc\u002F2.msc01-f",{"title":858,"path":859,"stem":860},"MSC02-F. Beware of compiler-specific extensions","\u002Fsei-cert-fortran-coding-standard\u002Fguidelines\u002Fmiscellaneous-msc\u002Fmsc02-f","9.sei-cert-fortran-coding-standard\u002F04.guidelines\u002F12.miscellaneous-msc\u002F3.msc02-f",{"title":862,"path":863,"stem":864},"MSC03-F. Do not depend on undefined behavior","\u002Fsei-cert-fortran-coding-standard\u002Fguidelines\u002Fmiscellaneous-msc\u002Fmsc03-f","9.sei-cert-fortran-coding-standard\u002F04.guidelines\u002F12.miscellaneous-msc\u002F4.msc03-f",{"title":866,"path":867,"stem":868,"children":869},"Procedures (PRC)","\u002Fsei-cert-fortran-coding-standard\u002Fguidelines\u002Fprocedures-prc","9.sei-cert-fortran-coding-standard\u002F04.guidelines\u002F13.procedures-prc\u002F1.index",[870,871,875,879],{"title":866,"path":867,"stem":868},{"title":872,"path":873,"stem":874},"PRC01-F. Disable the implicit declaration of procedures","\u002Fsei-cert-fortran-coding-standard\u002Fguidelines\u002Fprocedures-prc\u002Fprc01-f","9.sei-cert-fortran-coding-standard\u002F04.guidelines\u002F13.procedures-prc\u002F2.prc01-f",{"title":876,"path":877,"stem":878},"PRC02-F. Avoid implicit interfaces by using module procedures","\u002Fsei-cert-fortran-coding-standard\u002Fguidelines\u002Fprocedures-prc\u002Fprc02-f","9.sei-cert-fortran-coding-standard\u002F04.guidelines\u002F13.procedures-prc\u002F3.prc02-f",{"title":880,"path":881,"stem":882},"PRC03-F. Declare the intent for all dummy arguments","\u002Fsei-cert-fortran-coding-standard\u002Fguidelines\u002Fprocedures-prc\u002Fprc03-f","9.sei-cert-fortran-coding-standard\u002F04.guidelines\u002F13.procedures-prc\u002F4.prc03-f",{"title":884,"path":885,"stem":886,"children":887},"Scope, Association, and Definition (SAD)","\u002Fsei-cert-fortran-coding-standard\u002Fguidelines\u002Fscope-association-and-definition-sad","9.sei-cert-fortran-coding-standard\u002F04.guidelines\u002F15.scope-association-and-definition-sad\u002F1.index",[888,889,893,897],{"title":884,"path":885,"stem":886},{"title":890,"path":891,"stem":892},"SAD02-F. Minimize imported module entities using the ONLY clause","\u002Fsei-cert-fortran-coding-standard\u002Fguidelines\u002Fscope-association-and-definition-sad\u002Fsad02-f","9.sei-cert-fortran-coding-standard\u002F04.guidelines\u002F15.scope-association-and-definition-sad\u002F2.sad02-f",{"title":894,"path":895,"stem":896},"SAD03-F. Replace common block with modules for safer data encapsulation","\u002Fsei-cert-fortran-coding-standard\u002Fguidelines\u002Fscope-association-and-definition-sad\u002Fsad03-f","9.sei-cert-fortran-coding-standard\u002F04.guidelines\u002F15.scope-association-and-definition-sad\u002F3.sad03-f",{"title":898,"path":899,"stem":900},"Limit the scope of variables and procedures","\u002Fsei-cert-fortran-coding-standard\u002Fguidelines\u002Fscope-association-and-definition-sad\u002Flimit-the-scope-of-variables-and-procedures","9.sei-cert-fortran-coding-standard\u002F04.guidelines\u002F15.scope-association-and-definition-sad\u002F4.limit-the-scope-of-variables-and-procedures",{"title":902,"path":903,"stem":904,"children":905},"Types (TYP)","\u002Fsei-cert-fortran-coding-standard\u002Fguidelines\u002Ftypes-typ","9.sei-cert-fortran-coding-standard\u002F04.guidelines\u002F16.types-typ\u002F1.index",[906,907,911,915,919],{"title":902,"path":903,"stem":904},{"title":908,"path":909,"stem":910},"TYP01-F. Use Intrinsic Assignment for Character Entities","\u002Fsei-cert-fortran-coding-standard\u002Fguidelines\u002Ftypes-typ\u002Ftyp01-f","9.sei-cert-fortran-coding-standard\u002F04.guidelines\u002F16.types-typ\u002F2.typ01-f",{"title":912,"path":913,"stem":914},"TYP02-F. Prohibit implicit typing in all program units","\u002Fsei-cert-fortran-coding-standard\u002Fguidelines\u002Ftypes-typ\u002Ftyp02-f","9.sei-cert-fortran-coding-standard\u002F04.guidelines\u002F16.types-typ\u002F3.typ02-f",{"title":916,"path":917,"stem":918},"TYP03-F. Ensure intrinsic function arguments match intended precision","\u002Fsei-cert-fortran-coding-standard\u002Fguidelines\u002Ftypes-typ\u002Ftyp03-f","9.sei-cert-fortran-coding-standard\u002F04.guidelines\u002F16.types-typ\u002F4.typ03-f",{"title":920,"path":921,"stem":922},"TYP04-F. Centralize kind definitions to ensure consistent precision","\u002Fsei-cert-fortran-coding-standard\u002Fguidelines\u002Ftypes-typ\u002Ftyp04-f","9.sei-cert-fortran-coding-standard\u002F04.guidelines\u002F16.types-typ\u002F5.typ04-f",{"title":924,"path":925,"stem":926,"children":927},"Back Matter","\u002Fsei-cert-fortran-coding-standard\u002Fback-matter","9.sei-cert-fortran-coding-standard\u002F05.back-matter\u002F1.index",[928,929,933,937],{"title":924,"path":925,"stem":926},{"title":930,"path":931,"stem":932},"AA. Bibliography","\u002Fsei-cert-fortran-coding-standard\u002Fback-matter\u002Faa-bibliography","9.sei-cert-fortran-coding-standard\u002F05.back-matter\u002F2.aa-bibliography",{"title":934,"path":935,"stem":936},"BB. Definitions","\u002Fsei-cert-fortran-coding-standard\u002Fback-matter\u002Fbb-definitions","9.sei-cert-fortran-coding-standard\u002F05.back-matter\u002F3.bb-definitions",{"title":938,"path":939,"stem":940},"CC. Undefined Behavior","\u002Fsei-cert-fortran-coding-standard\u002Fback-matter\u002Fcc-undefined-behavior","9.sei-cert-fortran-coding-standard\u002F05.back-matter\u002F4.cc-undefined-behavior",{"title":942,"path":943,"stem":944},"Acknowledgments","\u002Fsei-cert-fortran-coding-standard\u002Facknowledgements","9.sei-cert-fortran-coding-standard\u002Facknowledgements",1785439591518]