Sig det som det er...

Jeg hører til den gruppe af mennesker der brød hulkende sammen af grin da en original IBM PC for mange år siden beordrede mig:

Citat:

Keyboard not found, press F1 to continue

Men nu gør følgende guldkorn den rangen stridig:

Citat:

Warning 445: Reuse of for loop variable 'res' at 'line 116' could cause chaos

For mit indre øje ser jeg folk hamstre gær i den lokale Netto butik og Dronningens livgarde med ladte geværer.

Det er FlexeLint v9 der har fået et nyt check og det er et glimrende eksempel på den slags potientielle fejl som FlexeLint påpeger, men som compilere ikke kan tillade sig at brokke sig over: Det er fuldt legalt, men sandsynligvis dumt.

Her er beskrivelsen fra manualen:

445 reuse of for loop variable 'Symbol' at 'Location' could cause
chaos -- A for loop nested within another for loop employed the same loop
variable. For example:

for( i = 0; i < 100; i++ ) {
...
for( i = 0; i < n; i++ ) { ... }
}

Det er fuldt ud lovlig C kode, der er endda, som i mit tilfælde, gode grunde til at gøre det, men i 9 ud af 10 tilfælde er det en programmørfejl.

phk

Kommentarer (13)
sortSortér kommentarer
  • Ældste først
  • Nyeste først
  • Bedste først
Eske Christiansen

I visual studio er der en bug/feature der enten får compileren til at fejle eller får kaos til at opstå

f.esk. void foobar() { for (list::const_iterator it....) { // noget kode }

for (list::const_iterator it....) { // noget kode }

i de fleste versioner af visual studio vil dette ikke compile med en fejl i det andet for loop. Dette er fordi "it" er blevet oprettet før. smukt!

det vil sige at dette kode er lovligt i visual studio

for (list::const_iterator it....) { // noget kode }

//noget kode it = myFooList.begin()

hvilket give noget kode som er let at læse og forstå.....

  • 0
  • 0
Deleted User

"For mit indre øje ser jeg folk hamstre gær i den lokale Netto butik og Dronningens livgarde med ladte geværer." Opfatter det som om at dit indre øje fortæller dig at et fortegn på kaos er at folk begynder at hamstre gær. Dette kunne godt være et sandt og muligt fortegn... Men Livgarden med ladte geværer. Det går de med til hverdag, så der er ikke meget kaos over lige den del af din sætning. :)

  • 0
  • 0
Jacob Christian Munch-Andersen

[code=c]for( i = 0; i < 100; i++ ) { ... for( i = 0; i < n; i++ ) { ... } }[/code] Brugbart kan det godt være, men jeg vil til gengæld vove at påstå at det er dårlig kodestil. Man forventer normalt at en "for" loop opfører sig som beskrevet i "for" linien. Du kunne bruge en "while" loop i stedet, ikke blot vil det behage FlexeLint, koden vil også være lettere tilgængelig for andre mennesker da en "while" loop angiver at man bliver nødt til at kigge mere på koden for at finde ud af hvordan den fungerer.

[code=c]i = 0; while( i < 100 ) { ... for( i = 0; i < n; i++ ) { ... } i++; }[/code]

  • 0
  • 0
Poul-Henning Kamp Blogger

Den kodestump er fra manualen, min er lidt anderledes og legal:

Jeg vandrer en liste af IP# for et hostnavn jeg har slået op og jeg kan enten håndtere et antal IPv4, eller et antal IPv6, men ikke en blanding.

Hvis jeg finder en blanding sparker jeg en fejlbesked ud, og til det bruger jeg samme iterator variable, og derefter returnerers med fejlkode, så den yderste sløjfe rammes aldrig igen.

Poul-Henning

  • 0
  • 0
Mark Gjøl

Det er sjovt som folk altid knækker sammen over den... Jeg har da selv oplevet fejlen, sat et keyboard i og trykket F1, så selvom det måske virker lidt underligt, er fejlen næsten så god som den kan blive: Den er kort, fyldestgørende og beskriver hvad du skal gøre for at afhjælpe den.

  • 0
  • 0
Peter Makholm Blogger

Den er kort, fyldestgørende og beskriver hvad du skal gøre for at afhjælpe den.

Den er unødvendig og løsningsforslaget beskriver højst et midlertidigt fiks. Den rigtige løsning er at gå ind i BIOS og klikke af at det er OK at maskinen ikke har noget tastatur tilsluttet.

"PC LOAD LETTER" beskriver i det mindste den eneste korrekte afhjælpningsmetode (såfremt man anvender letter-formatet).

  • 0
  • 0
Dennis Krøger

Den rigtige løsning er at gå ind i BIOS og klikke af at det er OK at maskinen ikke har noget tastatur tilsluttet.

Ja... Hvis det er OK at maskinen ikke har noget tastatur tilsluttet.

Hvis det ikke er OK, er den rigtige løsning at sætte tastaturet i, og trykke F1.

  • 0
  • 0
Torben Mogensen Blogger

Jeg har da selv oplevet fejlen, sat et keyboard i og trykket F1, så selvom det måske virker lidt underligt, er fejlen næsten så god som den kan blive: Den er kort, fyldestgørende og beskriver hvad du skal gøre for at afhjælpe den.

Jeg synes ikke, at den er fyldestgørende. Den mangler den vigtige besked: "make sure keyboard is plugged in properly, and then" før "press F1 to continue".

O.K, det gør teksten længere, men absolut mere forståelig. Hvis beskeden skal være kort, så kan man evt. bruge "connect keyboard and press F1".

  • 0
  • 0
Poul-Henning Kamp Blogger

Flexelint reagerer med flg for hver "case":

    case 7:      *to = *from++;  
a.c  10  Warning 616: control flows into case/default  
a.c  10  Info 825: control flows into case/default without -fallthrough comment  
a.c  10  Warning 646: case/default within do loop; may have been misplaced

Poul-Henning

  • 0
  • 0
Lars Lundin

Tak for det.

Med advarsel 646 distancerer Flexelint sig tydeligt fra GPL programmet "splint" (som kan analysere C89 men ikke C99).

splint accepterer uden et ord do/while løkken samt første case og giver denne advarsel for hver af de resterende cases:

duff.c:8:10: Fall through case (no preceding break)  
  Execution falls through from the previous case (use /*@fallthrough@*/ to mark  
  fallthrough cases). (Use -casebreak to inhibit warning)
  • 0
  • 0
Log ind eller Opret konto for at kommentere