{"id":2293,"date":"2015-04-11T07:04:57","date_gmt":"2015-04-11T06:04:57","guid":{"rendered":"http:\/\/roboblog.fatal-fury.de\/?p=2293"},"modified":"2015-06-02T12:00:49","modified_gmt":"2015-06-02T11:00:49","slug":"bug-of-the-day-2","status":"publish","type":"post","link":"http:\/\/roboblog.fatal-fury.de\/?p=2293","title":{"rendered":"Local variable will not retain values between function invocations (Bug of the day 2)"},"content":{"rendered":"<p><strong>Lokale Variablen behalten ihren Wert NICHT zwischen Funktionsaufrufe!<\/strong><\/p>\n<p>Es gibt in diesem Beispiel keinen Compilerfehler und auch keinen von Fortran erkannten Laufzeitfehler.<br \/>\nEs gibt Compiler Warnings die diesen Fehler zeigen, aber dazu bedarf es mehr Code. Ich habe dieses Beispiel m\u00f6glichst klein und \u00fcbersichtlich gehalten.<\/p>\n<p>Ausgabe ohne Optimierung und ohne Fehler<\/p>\n<pre> kater@ktux:~$ gfortran -Wall -Wextra -fcheck=all  bugoftheday_openreadclose.f95 \r\nkater@ktux:~$ .\/a.out \r\nfirst round\r\nDEBUG address of fhdl         BFC4D8FC\r\n open. set fhdl to         100\r\n read\r\n all file\r\n\r\n second round\r\nDEBUG address of fhdl         BFC4D8FC\r\n open. set fhdl to         100\r\nDEBUG address of test         BFC4D<strong>90C<\/strong>\r\n set test variabel to        1000\r\n read\r\n all file\r\n<\/pre>\n<p>Man beachte die unterschiedlichen Adressen der lokalen Variablen. Daher wird der Fehler nicht getriggert.<\/p>\n<p>Ausgabe mit Optimierung und mit Fehler<\/p>\n<pre>kater@ktux:~$ gfortran -Wall -Wextra -fcheck=all  bugoftheday_openreadclose.f95 -O1\r\nkater@ktux:~$ .\/a.out  \r\n first round\r\nDEBUG address of fhdl         BFA7DE38\r\n open. set fhdl to         100\r\n read\r\n all file\r\n\r\n second round\r\nDEBUG address of fhdl         <strong>BFA7DE38<\/strong>\r\n open. set fhdl to         100\r\nDEBUG address of test         <strong>BFA7DE38<\/strong>\r\n set test variabel to        1000\r\n read\r\n ERROR expect fhdl to be         100 but is        1000\r\n<\/pre>\n<p>Diesmal sind die Adressen der lokalen Variablen gleich! Die Variable fhdl wird ungeplant ueberschrieben!!<br \/>\nWelche Adresse die lokalen Variablen bekommen und ob so der Fehler auftritt oder nicht, ist zuf\u00e4llig und nicht beeinflussbar!!!<\/p>\n<pre><code>\r\n! Local variable will not retain values between function invocations\r\n! compile: gfortran -Wall -Wextra -fcheck=all  bugoftheday_openreadclose.f95\r\n! turn on any optimization to trigger the error\r\n\r\n\r\nsubroutine openread(action)\r\n  use testmodule\r\n  implicit none\r\n  character(len=*), intent(in) :: action\r\n  integer :: fhdl\r\n\r\n  if(action == 'open') then\r\n    fhdl = 100\r\n    write(*,'(A,Z16)') \"DEBUG address of fhdl \", loc(fhdl)\r\n    write(*,*) \"open. set fhdl to\", fhdl\r\n  else if(action == 'read') then\r\n    write(*,*) \"read\"\r\n    if(fhdl \/= 100) then\r\n      write(*,*) \"ERROR expect fhdl to be\", 100, \"but is\", fhdl\r\n    else\r\n      write(*,*) \"all file\"\r\n    endif\r\n  else if(action == 'close') then\r\n      write(*,*) \"close fhdl\", fhdl\r\n  endif\r\nend subroutine\r\n\r\n\r\nsubroutine overwriteLocalValue()\r\n  implicit none\r\n  integer :: test\r\n\r\n  test = 1000\r\n  write(*,'(A,Z16)') \"DEBUG address of test \", loc(test)\r\n  write(*,*) \"set test variabel to\", test\r\nend subroutine\r\n\r\nprogram bugoftheday\r\n  use testmodule\r\n  implicit none\r\n\r\n  write(*,*) \"first round\"\r\n  call openread(\"open\")\r\n  call openread(\"read\")\r\n\r\n  write(*,*)\r\n  write(*,*) \"second round\"\r\n  call openread(\"open\")\r\n  call overwriteLocalValue\r\n  call openread(\"read\")\r\nend program\r\n<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Lokale Variablen behalten ihren Wert NICHT zwischen Funktionsaufrufe! Es gibt in diesem Beispiel keinen Compilerfehler und auch keinen von Fortran erkannten Laufzeitfehler. Es gibt Compiler Warnings die diesen Fehler zeigen, aber dazu bedarf es mehr Code. Ich habe dieses Beispiel m\u00f6glichst klein und \u00fcbersichtlich gehalten. Ausgabe ohne Optimierung und ohne Fehler kater@ktux:~$ gfortran -Wall -Wextra [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[30],"class_list":["post-2293","post","type-post","status-publish","format-standard","hentry","category-allgemein","tag-fortran"],"_links":{"self":[{"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/posts\/2293","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2293"}],"version-history":[{"count":9,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/posts\/2293\/revisions"}],"predecessor-version":[{"id":2386,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/posts\/2293\/revisions\/2386"}],"wp:attachment":[{"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2293"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2293"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2293"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}