Schrikkeljaarfout in software legt tankstations Nieuw-Zeeland plat

Benzinepompen in Nieuw-Zeeland blijken niet goed voorbereid op een schrikkeljaar. Diverse zelfbedieningspompen in het land liggen plat doordat de software niet goed omgaat met de datum 29 februari.

Tankstations van Z Energy, Allied Petroleum en Gull zijn door de fout getroffen. Het probleem ligt bij de betalingssoftware, die door Inveco Group wordt gemaakt en geleverd, zegt een woordvoerder van Gull tegenover Bloomberg. De software lijkt niet te kunnen omgaan met de datum 29 februari, die eens in de vier jaar voorkomt, zo ook dit jaar. Z Energy onderschrijft die lezing.

De problemen doen zich alleen voor bij benzinepompen waar automobilisten zelf tanken en bij de pomp afrekenen. Betalen bij een caissière kan nog wel, wat betekent dat bemande tankstations gewoon operationeel zijn.

Hoe het probleem precies ontstaan is, weet ook Inveco Group niet, zegt ceo John Scott tegenover Reuters. De fout deed zich alleen voor in code bedoeld voor Nieuw-Zeeland. Het probleem is inmiddels verholpen. De vernieuwde software, die ook op 29 februari werkt, moet nu alleen nog worden uitgerold naar tankstations in Nieuw-Zeeland. De komende dagen wordt de glitch nader onderzocht.

Door Eveline Meijer

Nieuwsredacteur

29-02-2024 • 09:32

147

Submitter: jordy-maes

Reacties (147)

147
144
57
3
0
78
Wijzig sortering
Jammer dat ik 2100 hoogstwaarschijnlijk niet ga meemaken. Wil weleens zien hoeveel software dan omvalt omdat ze foutief denken dat het dan wél een schrikkeljaar is :Y)
2000 zou ook geen schrikkeljaar worden oorspronkelijk, maar is het wel geworden. Kan ook met 2100.
2000 is deelbaar door 400, dus was wel een 'normaal' schrikkeljaar. De jaren deelbaar door 100 zijn het niet, tenzij ze deelbaar zijn door 400, dan weer wel (zoals 2000 dus).
Er zijn voorstellen geweest (John Herschel) om jaren deelbaar door 4000 uit te sluiten, de verwachte fout is tegen die tijd 1,2 dagen.
Het 1e jaar deelbaar door 4.000 duurt nog 1.976 jaar. ;)
Het kan heel goed dat we daar tegen 3900 aan moeten gaan denken.

Er is ook een kans dat we dan sterrendatums zijn gaan gebruiken en het helemaal niet meer speelt.
Wanneer? 2000 is zowel in de Juliaanse als Gregoriaanse kalender een schrikkeljaar.
Volgens welke definitie van "oorspronkelijk"?

Vziw was het altijd al: een jaar deelbaar door 4, tenzij het deelbaar is door 100 en niet door 400.
2000 is deelbaar door 400, dus een schrikkeljaar.

[Reactie gewijzigd door .oisyn op 25 juli 2024 00:30]

Alle jaren zijn deelbaar door 4 en door 100.

Het levert alleen wel decimalen op :+
In ieder geval sinds 1975 toen ik als havo-leerlingetje bij computerkunde een programmaatje moest maken wat aangaf of een gegeven jaar een schrikkeljaar was of niet. In ECOL, wie kent dat nog?
Nee, 2000 is altijd als schrikkeljaar bedoelt geweest.

Het klopt inderdaad dat de 100tallen geen schrikkeljaar zijn, maar als ze ook deelbaar zijn door 400 - zoals 2000 - dan is het weer wél een schrikkeljaar :P
We krijgen eerst nog het 2038 probleem, al denk ik dat dat wel met een sisser afloopt. Zal ongetwijfeld het een en ander aan legacy omvallen.

https://en.wikipedia.org/wiki/Year_2038_problem
Zelfde met millennium bug :+. In 1998 kwamen ze er achter dat computers een reset deden naar 1-1-1970. Ook dat is met een sisser afgelopen :-)
een sisser inderdaad omdat heel veel mensen zich in het zweet hebben gewerkt om het te voorkomen.
Wordt inderdaad nog wel eens onderschat. Ik ben indertijd ruim een half jaar bezig geweest met een team om een behoorlijk groot software pakket om te bouwen. Juist omdat iedereen er zoveel tijd en moeite hebben ingestoken gebeurde er niets. Maar ja, dan denk iedereen, zie je wel, niets aan de hand...
Zelfde als met klimaatverandering en gat in de ozon laag. Er zijn nu nog mensen die roepen dat de wetenschap het allemaal maar overdrijft, zelfde als met het gat in de ozonlaag destijds. Wat mensen echter niet beseffen is dat er door die wetenschapper destijds ook duidelijk is gemaakt wat er moest gebeuren om het verder te voorkomen en dat de gehele wereld in 1 jaar tijd het roer heeft omgegooid met het verbannen van CFKs. En dat het daardoor uiteindelijk goed is gekomen (of aan het komen is).
Idem met zure regen. Vieze zwavelhoudende brandstoffen (kolen, stookolie) zijn verboden en dat heeft dus geholpen.
en lood in benzine
Dat is altijd het probleem. Of juist niet. Want als er geen grote problemen zijn ontstaan, is het voor het volk niet duidelijk waar al die regeltjes en ophef nou goed voor waren.

Dit effect zie je ook in beveiliging, en dan vooral IRL beveiliging, bijv op vliegvelden of op straat. Het is zo veilig overal, waarom dan al die politie? Nou daarom dus :)
Ja er stonden zelfs stickers op bepaalde verkochte computers deze niet aan te zetten op/na 31/12/1999
laatst nog eens een dos systeem uit 1993 aangezet (hij deed het nog) De datum ging inderdaad fout, maar WP5.1 had geen probleem.
Dat is met een sisser afgelopen omdat er heel hard gewerkt is om essentiele systemen te fixen.

Het Y2038 probleem zal waarschijnlijk dezelfde handeling nodig hebben. De makkelijkste fix is gebruik maken van een unsigned 32-bits integer ipv een signed 32-bits integer, dan kun je het probleem weer met nog eens 68 jaar vooruit schuiven :P.
Lijkt zo makkelijk, maar als je een low level datatype wijziging doorvoert is er altijd een goede kans dat ergens nog code rondhangt die het jaar dan alsnog als een signed integer leest. Als je toch de betekenis van zo'n struct aanpast waardoor code aangepast moet worden kan je er beter gelijk backward incompatible maken en er een 64 bits waarde in stoppen.

Vrijwel alle besturingssystemen en applicaties hebben al een fix, het probleem zit vooral in legacy applicaties die niet meer bijgewerkt worden, over 14 jaar nog gebruikt worden, er op staan de datum uit een 32 bits veld te halen _en_ een real time klok gebruiken (een embedded thermostaat met CPU die start op 0 heeft geen issues). Waarschijnlijk zijn dat er nu al verwaarloosbaar weinig.
ergens nog code rondhangt die het jaar dan alsnog als een signed integer leest
Ik neem aan dat je timestamp bedoelt, maar idd. Nou ja, niet het lezen, signed en unsigned ints zijn over het algemeen binair compatible. Het gaat vooral om de omzetting naar datumtijd (die moet de bits als unsigned interpreteren), en vergelijkingen (timestamps na 2038 moeten niet als kleiner dan voor 2038 worden vergeleken, door signed ints te comparen ipv unsigned ints)
het probleem zit vooral in legacy applicaties die niet meer bijgewerkt worden
Precies zoals met Y2k dus.

[Reactie gewijzigd door .oisyn op 25 juli 2024 00:30]

Ik neem aan dat je timestamp bedoelt, maar idd. Nou ja, niet het lezen, signed en unsigned ints zijn over het algemeen binair compatible.
Klopt en ja, het kan compatible gemaakt worden als er 'ones' complement' notatie gebruikt wordt.
Maar daarmee schuif je het probleem alleen maar op naar de software die alsnog aangepast moet worden om daarmee om te gaan dus dan kan je net zo goed een minder hacky oplossing pakken die geen stille verrassingen oplevert omdat alles goed lijkt te gaan tot je een corner case raakt.
het kan compatible gemaakt worden als er 'ones' complement' notatie gebruikt wordt.
Of two's complement of sign-and-magnitude. Waarbij ones' complement en sign-and-magnitude in de praktijk vrijwel nooit voorkomt.

Het punt is, het gaat alleen om timestamps vóór 2038, want die erna zijn niet te representeren in de huidige systemen die last hebben van de bug, dus die komen sowieso al niet voor. Dat zijn dus alleen positieve ints, en de representatie daarvan in signed en unsigned integers zijn binair identiek. Het datatype wijzigen van signed naar unsigned maakt oude data dus niet ineens incompatible.

Het gaat natuurlijk wel mis als er negatieve timestamps worden gebruikt voor tijdstippen vóór 1970. Dan is er weinig andere keuze dan meteen de overstap naar (signed) 64-bits ints te maken.

[Reactie gewijzigd door .oisyn op 25 juli 2024 00:30]

Het datatype wijzigen van signed naar unsigned maakt oude data dus niet ineens incompatible.
Het gaat in dit geval om een domme counter waarbij het gevaar zit in de manier waarop die geïnterpreteerd wordt. In die zin wordt de data dus wel incompatibel omdat die niet consistent is met aannames in applicaties. Door het 'subtiel' te fixen roep je ongetwijfeld ladingen ongewenst gedrag over je af die je pas ziet op het moment dat ze optreden, doorgaans te laat en op productieomgevingen ;)
Ik zie 2038 als groter probleem dan 2000.

Omdat er in de afgelopen 24 jaar extreem veel meer computers zijn bijgekomen. Het aantal type systemen dat vernieuwd dient te worden is daardoor vele male groter dan in 1999/2000.

De kans er systemen niet op tijd patched zijn zal veel groter zijn. Zeker de miljoenen IoT dingen in de wereld.
Ondertussen zijn er al jaren fixes beschikbaar, zelfs voor de 32 bits hardware die problematisch was. Als je nu een goedkope 32 bits IoT controller bouwt met Linux werkt die softwaretechnisch tot ver na 2038.
Ik ga er niet vanuit dat alle apparaten vervangen zijn, maar het lijkt me bijzonder als voor echte 'mission critical' zaken dan nog op spullen van vrijwel 20 jaar oud wordt vertrouwd.
Y2038 wordt geen probleem. Vanuit gaande dat je tussen nu en 2037 eens je systeem opnieuw installeert.

Ze zijn bezig met de laatste patches te maken.
https://lists.debian.org/...nce/2024/02/msg00005.html

En hiermee verschuiven we het probleem naar 292 277 026 596-12-04 15:30:08 UTC. :)
"Ze"? Ik hoop dat je snapt dat dit niet alleen een intern linux probleem is. Tal van software op allerlei OS'en gebruiken een signed 32-bits unix timestamp. Al die software moeten worden aangepast.

[Reactie gewijzigd door .oisyn op 25 juli 2024 00:30]

En dat is van tv, telefoon, alarm systeem tot auto.
Heb je nog wel even voor om te regelen al met al.
Bij die millennium bug begon de herrie pas een een jaar of twee voor het moment dat het de soep in zou lopen.
Jups denk aan systemen die niet aan een netwerk of internet hangen. Liften, weegschalen, cctv.

Maar ook geïsoleerde netwerk systemen. Zoals systemen die bruggen, sluizen las en of montage robots.
En ik hoop dat liften, bruggen en sluizen die nu geïnstalleerd worden nog wel langer dan 14 jaar meegaan.
Niet naar 1970, maar naar 1900. Het probleem was dat ze het jaartal opsloegen als 98 voor 1998, waar 2000 dus 1900 zou worden zonder fix. en dan nog heb ik een verhaal gehoord van iemand van 103 jaar oud die bij de dokter kwam en de dokter een 3 jarige verwachte.
Mijn opa kon op 101-jarige leeftijd geen afspraak maken bij de gemeente omdat de dropdown voor geboortejaar maar 99 jaar terugging in de tijd |:(
Zucht. Onnodig strikte validaties / formulieren met aannames. Ook ik heb er wel een paar dozijn gemaakt in het begin van mijn carriere.

Voor mij was de omslag om er beter over na te gaan denken een artikel over de aannames die software ontwikkelaars doen over namen :)

https://www.kalzumeus.com...mers-believe-about-names/
Ik heb alleen maar zoiets eenvoudigs als een "de" in mijn naam en zelfs daarmee gebeurt van alles en nog wat: automatische "correctie" naar een hoofdletter in alle gevallen, automatisch spatie weghalen, en sorteren onder Z (ASCIIbetisch :) ). En dat is niets dan simpele ASCII.

[Reactie gewijzigd door Frenziefrenz op 25 juli 2024 00:30]

I see your "de" and raise to "van 't":
-twee woorden
-leesteken
Te vaak feest. Bij ING zijn er pagina's in de app of op de site (weet ik even niet meer) waar de apostrof een &#nnnn wordt. Heb mijn naam een keer bovenaan de lijst gevonden, want gesorteerd op de apostrof en die kwam voor de A. Niet-Nederlandse formulieren houden sowieso geen rekening met tussenvoegsels. Formulieren die de apostrof afkeuren als geldig leesteken. En mijn buitenlandse collega's zitten vaak te stunten hoe ze me moeten noemen: "Dear Van"... Altijd leuk :)

[Reactie gewijzigd door Reptile209 op 25 juli 2024 00:30]

Bij mij idem, en ook op basis van hetzelfde artikel! Ik raad het met enige regelmaat aan aan collega's die - in mijn ogen - een simpele aanname doen over iets wat oneindig veel complexer is dan ze denken.
en hoe heeft hij dat uiteindelijk opgelost?
Volgens mij heeft iemand anders de afspraak gemaakt.
Er zijn meerdere "Y2K" problemen die alle te maken hebben met overflow. Een daarvan was dat jaartallen als 2-cijferig getal 1900 werd opgeslagen. In dat geval kwam na 1999 het jaar 1900 ipv 2000. Andere problemen hadden te maken met het feit dat er een interne klok werd gebruikt met "tick" tov een referentie datum. Afhankelijk van de referentie datum, de resolutie van de "tick" en de lengte van de "tick"-count krijg je verschillende overflows. Ik heb als referentie data al van alles voorbij zie komen, van 17-nov-1858 tot 1-jan-1970 en diverse data daar tussen.

Wat ik echter niet begrijp dat, met dit in het achterhoofd, iemand nog kan besluiten om een eigen klok te implementeren. Het lijkt erop dat dat in het probleem waar het artikel overgaat is gebeurd.
Dat het met een sisser is afgelopen komt omdat de IT-sector keihard gewerkt heeft om problemen te voorkomen. Maar dan zie je direct weer rare irrationele gedachtenkronkels bij mensen: het gaat goed doordat alles volgens plan is aangepast, "dus was er niets aan de hand". Als het fout was gegaan was degene die het probleem had opgelost een held geweest.
Het 2038 probleem gaat veel groter zijn. Loop er zelf ook al geregeld tegenaan dat het probleem speelt.
Ik kan het mis hebben, maar 100 jaar na de Unix timestamp in 2070, lijkt mij ook een kanshebber voor problemen.
dat heb je inderdaad mis
Met een sisser klopt ongeveer, maar dat is ook omdat een ongelofelijke hoeveelheid werk is verzet om de onderliggende code van al die software vrij te maken van deze millenium bug. Ik heb code gezien waarvan de problemen 100% gegarandeerd zouden zijn (want daarvoor schrijf je testcode :-) ).
Oh dat geloof ik ook hoor maar toch vind iedereen het spannend. Wat ze in die 2 jaar allemaal gerepareerd hadden werkt het dan ook?
Stiekem komt 2038 toch wel hard dichterbij. Als ik zie hoeveel 20 jaar oud legacy spul nu nog draait over de hele wereld, gaat er toch nog wel heel veel vervangen moeten worden om dat te voorkomen.
32-bit is niet zomaar overgezet naar 64-bit.
Zeker weten, ik verwacht ook wel dat er het een en ander niet mee overweg kan. Maar ik zie ook wel, zelfs veel legacy systems, die niet unix timestamps gebruiken maar "gewoon" yyyy-mm-dd en die zijn minder gevoelig voor dit probleem, tenzij ze under-the-hood alsnog timestamps gebruiken.

En ze zijn ook al vele jaren bezig met 32-bit uit te faseren, niet alleen om problemen als dit maar ook om bestandsopslagproblemen te kunnen voorkomen.
16 bit spul blijkbaar ook niet. Ik zag laatst een nieuwsrapportage dat er ergens nog een Commodore Amiga 2000 zo belangrijk was dat men spullen op eBay kocht om het maar draaiende te kunnen houden :/
Ik ben er niet helemaal gerust op nog.
Bijvoorbeeld ESPHome besteedt er wel aandacht aan, maar dan nog is het echt aan de programmeur om er iets mee te doen:
.timestamp
Unix epoch time (seconds since UTC Midnight January 1, 1970)
[-2147483648 - 2147483647] (negative values for time past January 19th 2038)
https://esphome.io/components/time/index.html
Nice. Kende ik nog niet. Fantastische naam trouwens the "Epochalypse" _/-\o_
Inderdaad, dat is er wel eentje die veelal niet bekend is: alleen eeuwjaren deelbaar door 400 gelden als schrikkeljaar.
Veel "volautomatische" kalenders (zoals digitale horloges zonder verdere connectivity) gaan maar tot 2099, dus dat wordt leuk voor wie dan antieke hardware heeft :)
TIL. Dit wist ik helemaal niet :o

Is er ook niet zoiets dat de aarde alsmaar dichter bij de zon komt en dus sneller errond begint te draaien (jaartijd) en ook dat de aarde trager rond diens eigen as begint te draaien (dagtijd)? Dus op termijn zal ons concept van tijd toch wel verder herzien moeten worden, niet?
Doet Office 365 het vandaag? 8)7
Kan me wel voorstellen dat dit toch nog fout gaat soms. Zo veel plekken in het process waarop datums gebruikt worden dat het wel eens fout kan gaan. Het ene systeem werkt met epoch, het andere met simpele yyyymmdd notatie, weer een andere doet utc met een timezone aanduiding. Als er dan ook maar ergens een datum verkeerd wordt geïnterpreteerd kan het zomaar zijn dat de pin automaat de datum niet accepteerd omdat je omzetting naar epoch vanuit utc niet goed gaat voor je betreffende timezone. Blijft lastig dat hele proces vlekkeloos te krijgen als je met meerdere systemen werkt.
UTC met tijdzone bestaat sowieso al niet. Je bedoeld denk ik een datum/tijd zonder zone aanduiding want UTC is een datum/tijd met zone. (Zone Zulu) maar ook, notatie is weer want anders dan hoe het geïmplementeerd is, dat gebeurt helaas nog vaak met een 32 bit doen dat zou sowieso een tijd zijn tov epoch. Nee, imho de ont ontwikkelaar heeft ergens eens api niet goed begrepen of heeft lopen goochelen met tijden.
Punt is dat verschillende systemen verschillend geïmplementeerd kunnen zijn. Als ik van een gps ontvanger de tijd pak in numeriek formaat, en die in .net met DateTime.Parse laat interpreteren, kom ik op een verkeerde tijd uit na een tijdje. Tijdens het testen lijkt het goed, maar naar een paar jaar klopt het niet meer. Waarom? Omdat de gps tijd niet gecorrigeerd wordt, maar Windows dat wel doet. En draai je .net op Linux, dan is er een tijdje geweest waarop de ene distributie wel goed liep, en de andere niet. Als je dan afhankelijk bent van de datum/tijd om volgorde van transacties te bepalen bijvoorbeeld, gaat dat niet meer goed.

Dan heb je alle stappen getest, alles lijkt goed. Geen eigen libraries gemaakt voor de datum/tijd afhandeling want dat is foutgevoelig. Draait ook jaren stabiel. En dan zit in het vliegtuig en als je land ligt het vluchtsysteem op de luchthaven eruit.

Niet vragen hoeveel tijd het gekost heeft om daar achter te komen.

[Reactie gewijzigd door barbarbar op 25 juli 2024 00:30]

Ja, maar dan had je de specificatie van tijd via GPS moeten lezen, GpS tijd is niet UTC tijd. Alhoewel de meeste GPS devices wel UtC voor je kunnen aanleveren. Over dit onderwerp staat wel ontzettend veel fout geschreven op het internet, ik kan dat niemand kwalijk nemen…
Dat gps tijd niet utc tijd is weet ik donders goed, dat hoef je niet uit te leggen. Punt is dat verschillende systemen daar een andere implementatie op nahouden, en je daar pas achterkomt als je een systeem bijvoorbeeld gaat overzetten van Windows naar Linux, of van distro wisselt, of systemen op verschillende momenten update. Uiteraard kun je dan zeggen: lees de documentatie, test alles e.d. Maar soms zijn zulke fouten vrijwel niet te voorkomen of te achterhalen.
Als die omzetting niet goed gaat, dan zou je verwachten dat het elke dag fout gaat.

Het heeft ook niets met tijdzones te maken, lijkt me. Het is een NZ systeem, en daar hebben ze bij mijn weten maar 1 tijdzone. Het hele systeem kan dus worden beperkt tot lokale tijd, dus tijdzones volledig negeren.
Alsof de software maar voor één land wordt gemaakt... Zie in de reacties hier ook waarom het misgaat, iedereen heeft zo'n z'n eigen mening over hoe het zou moeten. En dus krijg je tig verschillende implementaties. Dan gaat er in de communicatie wel eens wat mis.
Als het voor meerdere landen wordt gemaakt, kan dáár ook lokale tijd aangehouden worden.

Tenzij het natuurlijk gaat om die rare landen die meerdere tijdzones hebben. Stelletje uitslovers :)
En dan kom je ineens nog ergens een string tegen in US format :+
Daarom altijd werken met interne notatie en het formatteren op het allerlaatste moment.
Dat is leuk voor één lokaal programma'tje wat je op je eigen pc draait. Ga je een systeem maken wat met tig andere systemen moet samenwerken, dan gaat dat niet op. Voor een tankstations kan ik zo een hele rits systemen op noemen, waarbij als er maar ééntje de gegevens verkeerd interpreteert de boel plat ligt.

De pomp zelf moet de prijs krijgen om te tonen. Hier zit ook een datum en tijd aan vast, want je wilt immers niet tijdens het tanken opeens een andere prijs hebben.
Het kassasysteem krijgt de prijzen van een centraal systeem. Dat centrale systeem bepaald prijzen aan de hand van data van de concurrenten, olieprijzen, weervoorspelling, feestdagen e.d.
Het kassasysteem moet omgaan met allerlei tankpassen, kortingspassen, pinautomaten van diverse leveranciers.
Het uiteindelijke afrekenen gebeurd door een bepaald bedrag vooraf te blokkeren bij de bank, al die logica en code moet feilloos met alle datums en tijden omgaan.
Daaromheen zitten nog een paar systemen die "meekijken" en kunnen ingrijpen als er iets niet lijkt te kloppen.
Kijk, nu klinkt het een stuk begrijpelijker waarom de datum zo belangrijk is. Dan nog zou je willen weten wat er nou precies mis ging. OK, het is een schrikkeljaar, maar dat is het op alle systemen. Het zou ook raar zijn als er ergens in de code van uit wordt gegaan dat februari altijd 29 dagen heeft (ik noem maar wat), dus wat was het dan?
Zoals in de bronnen staat zit het ergens in de code van het betaalproces voor Nieuw-Zeeland. Mijn gok is dat de betaalterminal via het kassasysteem een koppeling heeft met een lokale bank, en dat er in dat stukje een verkeerde datum wordt meegegeven waardoor de betaling geweigerd wordt. Waarom wordt er dan een verkeerde datum meegegeven? Tsjah, dat is de vraag die ze nu uitzoeken. Kan zo simpel zijn als de offset van een notatie verkeerd tellen (+12:00). Maar kan ook zijn dat er een transactiehash niet klopt, omdat er in de genererende hashfunctie van een betaalpas geen rekening gehouden is met een schrikkeljaar, maar bij bank die de hash controleert wel en die dus weigert. En alles wat daar tussenin zit.
De fout deed zich alleen voor in code bedoeld voor Nieuw-Zeeland.
Dat klinkt alsof iemand zo slim was om zijn eigen library voor het afhandelen van tijd te implementeren. Twee zaken die je nooit zelf implementeert: tijd en cryptografie. Pak een library van de stapel, want de ruimte om fouten te maken is ontzettend groot. ;)
Het probleem is inmiddels verholpen. De vernieuwde software, die ook op 29 februari werkt, moet nu alleen nog worden uitgerold naar tankstations in Nieuw-Zeeland.
Dus het probleem is nog niet verholpen.
Er zijn anders genoeg libraries met problemen geweest ;). Ik heb hier met enige regelmaat een artikel gelezen over iPhones met problemen rond de jaarwisseling.

Mijn persoonlijke pet peeve is een Windows C library functie die een UNIX timestamp converteert naar een Windows FILETIME timestamp.

Een UNIX timestamp is het aantal seconden sinds 1 januari 1970 0:00 UTC.
Een FILETIME timestamp is het aantal 100-nanoseconden sinds 1 januari 1601 0:00 UTC.

Conversie ertussen zou dus niet zo moeilijk moeten zijn: gewoon een lineaire transformatie. Alsof je van graden Celcius naar graden Fahrenheit gaat oid. Dus je telt er eerst het aantal seconden tussen die twee epochs bij, en daarna vermenigvuldig je met 10.000.000. Kind kan de was doen,.

Maar wat deed de library functie? Hij pakte eerst de datum en tijdrepresentatie van de UNIX timestamp in de lokale tijdzone, en zette dat vervolgens weer om naar een FILETIME. Alleen pakte die eerste conversie de huidige daylight savings tijd mee (ook al was de timestamp zelf in een niet DST-periode), en de tweede functie hield daar wel rekening mee. Of misschien was het precies andersom, ik weet het niet meer. Met als gevolg dat alle wintertijd timestamps tijdens de zomertijd er een uur naast zaten |:(

[Reactie gewijzigd door .oisyn op 25 juli 2024 00:30]

Is die FILETIME-conversie fout? Het klinkt eerlijk gezegd als een herimplementatie van FileTimeToLocalFileTime met eventueel een zomertijdfout.

Microsoft heeft in het DOS/FAT-tijdperk een hele hoop timestamps gegenereerd die in lokale tijd waren opgeslagen, dus afhankelijk van op welke plek de library wordt gebruikt, kan de implementatie correct zijn.

Het bestaan van een lokale FILETIME is in mijn ogen een fout (helemaal aangezien daar geen tags aan zitten die aangeven of deze lokaal is of niet), maar de conversie tussen Unix, FILETILE, en lokale FILETIME hebben allemaal hun plek. Ik denk niet dat je een algemene API kunt maken die altijd klopt omdat één formaat tijdzones bevat en het andere (soms) niet. Ik verwacht dat toen Microsoft hun API POSIX-compatible maakte ergens in de jaren '90, de beslissing niet per se incorrect was, en dat het foutieve gedrag alleen maar bestaat omdat het veranderen van dat gedrag meer problemen gaat opleveren.

Gelukkig is tegenwoordig de API wel redelijk consistent op Windows, en hebben de meeste programmeertalen (zelfs C++) tijd-API's die niet aan het OS gebonden zijn.
Is die FILETIME-conversie fout? Het klinkt eerlijk gezegd als een herimplementatie van FileTimeToLocalFileTime met eventueel een zomertijdfout.
Die functie ligt ten grondslag aan de fout. Die functie wordt gebruikt, en die houdt dus geen rekening met de DST van het tijdstip zelf, maar past de actuele DST-setting toe 8)7.

Ik heb op GoT ooit eens de code post van de C libary functie: https://gathering.tweaker...message/37783706#37783706. Het betreft dus de klasse van C-functies die de klassieke UNIX timestamps in C toepassen op de FILETIME times van files in het filesystem.

Wat betreft je opmerking over local FILETIMES, helemaal mee eens dat dat niet zou moeten bestaan. . Maar dat verhaal is hier niet helemaal van toepassing. De FILETIMEs van files zijn niet lokaal, en UNIX timestamps zijn dat ook niet. Om dat dan door een locale tijdrepresentatie te halen is totale waanzin 8)7.
Daar klopt inderdaad geen hol van. Doet Microsoft dat nog steeds? Anders misschien ff op de feedbackknop van het MSDN-artikel rammen? Dit is het soort code dat ik als eerstejaars zou hebben geschreven 8)7

ReactOS doet het wel goed zo te zien: https://doxygen.reactos.o...3407e0db5483f27829f1483ec En dan zeggen ze dat ReactOS bestaat uit gejatte code van Windows :)
Maar wat deed de library functie? Hij pakte eerst de datum en tijdrepresentatie van de UNIX timestamp in de lokale tijdzone, en ....
Dit is niet zozeer een probleem van de libraries maar van de figuren die er mee aan de slag gaan zonder te weten wat ze doen. Blijkbaar had de brave borst geen idee wat UTC inhoud. Zulke mensen moet ver bij elke datum/tijd functie weghouden.
Dit is niet zozeer een probleem van de libraries maar van de figuren die er mee aan de slag gaan zonder te weten wat ze doen.
Het is de implementatie van een C library functie die wordt meegeleverd met Visual C++. Specifiek, het zijn functies die de tijd van een file opvragen of zetten. De C library functies gebruiken een UNIX timestamp, maar de win32 API gebruikt FILETIMES, dus vandaar de conversie.

.edit: moest even wat graven, maar ik heb hier 12 jaar geleden iets gedetailleerder over geschreven: https://gathering.tweaker...message/37783706#37783706

[Reactie gewijzigd door .oisyn op 25 juli 2024 00:30]

Dat zegt waarschijnlijk meer over de kennis betreffende kalenders bij Microsoft :) . Daar wordt opdat gebied wel meer gerommeld (excel!).
Het punt was dat The Zep Man zei: "Pak een library van de stapel, want de ruimte om fouten te maken is ontzettend groot"
Daar ben ik het voor 100% mee eens maar ik kreeg de indruk dat u een andere mening was toegedaan.
Blind op libraries is nooit verstandig, het blijft belangrijk o.a. om te kijken waar die library vandaan komt.
Dat kan niet altijd, even effe ergens een library pakken.
- soms schrijf je in een taal waarbij er geen libraries beschikbaar zijn. Of het niet gewenst is.

Maar over het algemeen heb je gelijk, niet je eigen brakke implementatie schrijven als het niet nodig is en andere al hun hoofd erover gebroken hebben en dit duidelijk stabieler is.

[Reactie gewijzigd door Zezura op 25 juli 2024 00:30]

Dat kan niet altijd, even effe ergens een library pakken.
- soms schrijf je in een taal waarbij er geen libraries beschikbaar zijn. Of het niet gewenst is.
Dan is er eerder in het traject iets fout gegaan qua keuze voor architectuur en taal. Tijd en cryptografie wil je nooit zelf doen, want de kans is zo ontzettend groot dat er iets fout gaat. Zelf maar "even iets snel" implementeren is gelijk aan het accepteren van een gigantische technical debt.

[Reactie gewijzigd door The Zep Man op 25 juli 2024 00:30]

Je gaat er nu wel erg vanuit dat
  • dat er 'effe' een library beschikbaar is.
  • het probleem rechtstreeks met de datum berekening te maken heeft
Veel financiële systemen zijn ontwikkeld in Cobol. Dat is nog een oude procedurele taal. Dat is, op z'n zachtst gezegd, geen taal die bekend staat om zijn flexibele en uitgebreide libraries.

Daarnaast kan het probleem ook prima op andere plekken in de software zitten waardoor het probleem een afgeleide is van de datum an-sich. B.v. er is een array gedefinieerd met voor februari maar dimensie van 28 diep. (ik verzin maar wat) Daar sta je dan met je datum van 29 februari uit een prima datum/tijd-library.
Je gaat er nu wel erg vanuit dat
  • dat er 'effe' een library beschikbaar is.
  • het probleem rechtstreeks met de datum berekening te maken heeft
Veel financiële systemen zijn ontwikkeld in Cobol. Dat is nog een oude procedurele taal. Dat is, op z'n zachtst gezegd, geen taal die bekend staat om zijn flexibele en uitgebreide libraries.
Dan is er eerder in het traject iets fout gegaan qua keuze voor architectuur en taal.
Dat geldt ook voor Cobol. Het enig verschil met dit artikel is dat die foute keuze veel langer geleden gedaan is, en dat men leeft op technical debt.

Dan nog kan Cobol ingebouwde time libraries hebben. Ook voor Cobol geldt: het is onwaarschijnlijk dat je de eerste bent met een probleem. Vermijdt het "not developed here"-syndroom, en kies voor iets dat al bestaat.
Daarnaast kan het probleem ook prima op andere plekken in de software zitten waardoor het probleem een afgeleide is van de datum an-sich. B.v. er is een array gedefinieerd met voor februari maar dimensie van 28 diep. (ik verzin maar wat) Daar sta je dan met je datum van 29 februari uit een prima datum/tijd-library.
Dat valt onder "zelf maar even iets snel implementeren". Als je zelf individuele arrays definieert per maand dan doe je iets fout. Dat laat je aan je time library over.

[Reactie gewijzigd door The Zep Man op 25 juli 2024 00:30]

Dan nog kan Cobol ingebouwde time libraries hebben.
Een conversie van het ene datumformaat/tijdzone naar het andere is heel wat anders dan een echte functionele library.
Een module in Cobol aanroepen is een hele klus en lang niet zo flexibel als b.v. in Java, of een andere OO-taal. Vergis je daar niet in !
Als je zelf individuele arrays definieert per maand dan doe je iets fout.
Je wil je resultaten toch ergens naar toe schrijven ?! Die array kan b.v. bedoeld zijn om je factuur mee op te maken. Dat zit echt niet in een time-library.
Je wil je resultaten toch ergens naar toe schrijven ?! Die array kan b.v. bedoeld zijn om je factuur mee op te maken. Dat zit echt niet in een time-library.
Een beetje time library vertelt je over een jaar hoeveel dagen in een specifieke maand zitten. Met dat aantal kan je je array definiëren.
Dus... jij gaat aan een time library vragen hoeveel dagen een maand heeft om daarmee vervolgens je array te definiëren ? Dat is pure overkill.
Maar goed... die hele array was maar een hypothetisch voorbeeld. Het ging mij er om dat er ook op andere punten foutjes gemaakt kunnen worden die niet meteen uit een library komen.
Dus... jij gaat aan een time library vragen hoeveel dagen een maand heeft om daarmee vervolgens je array te definiëren ? Dat is pure overkill.
"Dat is pure overkill" is wat men dacht bij het implementeren van de code die leidde tot de bug waar dit artikel over gaat. Zoals genoemd, tijd en cryptografie implementeer je nooit zelf. Helaas is het een les die elke juniorprogrammeur zelf moet ontdekken, terwijl de seniors hoofdschuddend toekijken.

Een slechte programmeur doet alles zelf.
Een goede programmeur gebruikt het werk van anderen en leert van de fouten van anderen.
Het ging mij er om dat er ook op andere punten foutjes gemaakt kunnen worden die niet meteen uit een library komen.
Als bij een dergelijke fout zoals in het artikel een standaard time library niet is gebruikt, dan is de fout dat een standaard time library niet werd gebruikt.

[Reactie gewijzigd door The Zep Man op 25 juli 2024 00:30]

"Dat is pure overkill" is wat men dacht bij het implementeren van de code die leidde tot de bug waar dit artikel over gaat.
Tjonge wat ben jij zeker van je zaak. Jij weet blijkbaar tot in detail wat er mis is gegaan. _/-\o_
Helaas is het een les die elke juniorprogrammeur zelf moet ontdekken, terwijl de seniors hoofdschuddend toekijken.
Je weet zelfs dat de fout door een juniorprogrammeur is gemaakt ! :Y)

Hoe weet jij dat zo goed ? Was jij zelf die junior programmeur ? Of was jij die senior die hoofdschuddend toekeek ? (En vervolgens verzuimde in te grijpen...)

Of, en dat acht ik veel waarschijnlijker, ben jij zo'n spreekwoordelijke stuurman aan de wal die nauwelijks ooit eens een fatsoenlijk programma gemaakt heeft ?
Want als je dat wél gedaan hebt dan weet je dat je als programmeur dat bugs een fact of life zijn. Ze zitten op de meest rare plekken. Oók in de door jou geroemde libraries.
Bugs doen soms rare, onverwachte dingen. Ze veroorzaken een fout op het ene punt in het programma en komen soms pas vele regels code later aan het licht.

Het is pure arrogantie wanneer je op basis van de zeer beperkte informatie in dit artikel denkt te kunnen bepalen wat de fout hier is geweest. Laat staan dat je een oordeel over de programmeur in kwestie kunt geven. 8)7

[Reactie gewijzigd door T-men op 25 juli 2024 00:30]

Dan heb je het over de back-end bij de financiële instellingen. Niet over de PIN-terminals bij automatische tankstations.
Als je een taal kiest zonder degelijke timestamp library, dan kies je de foute taal voor productiesoftware ;)
Assembly is er een. En het wordt meer gebruikt dan je denkt.
Een taal waar geen date libraries voor zijn? welke is dat?
DOS batch. Brainfuck.
Anders dan voor de fun is niemand echt legit bezig met brainfuck, toch?
Dat is IT taal. Het probleem is verholpen.
De implementatie daarvan is een ander onderwerp.
Morgen is het probleem waarschijnlijk ook verholpen. Tenzij het een verschuifprobleem is en je ook na de schrikkeldag niet in sync bent.
Morgen is het probleem waarschijnlijk ook verholpen.
Niet als het niet geïnstalleerd is. Dan zit men in 2028 weer in de ellende.
Ik ben toch wel echt benieuwd wat ze hebben gedaan dat deze bug veroorzaakt. Het implementeren van DateTime is iets dat je lekker moet overlaten aan organisaties die dit als hoofddoel hebben.
Tom Scott - The Problem with Time & Timezones - Computerphile
Juist bij Tweakers zou je verwachten dat er ook iets meer details bij staan of zelfs een gedetailleerde analyse wat er precies fout ging. Steek je er misschien nog wat van op of zo.
Dat is dus niet bekend, als dat bekend zou zijn zal het er waarschijnlijk bij hebben gestaan maar het bedrijf heeft niet meer gezegd dan dit.
Misschien zelf eerst iets meer onderzoek doen om zeker te weten dat deze informatie überhaupt publiek is voordat je klaagt dat er niet over wordt geschreven
Dit filmpje was het eerste waar ik aan dacht toen ik dit bericht las! Blijkbaar zit dit nog steeds niet ingebakken bij programmeurs!
Dat zijn geen programmeurs, dat zijn scriptkiddies
Had Einstein toch gelijk, tijd is relatief en niet absoluut
Leuk dat er die libraries zijn, maar dan moet je ze ook goed gebruiken. Datetimestamps gebruiken obv local time gebeurt nog steeds heel HEEL erg veel. Genoeg developers denken er niet eens aan, verschillende timezones, verschillende daylightsavingtimes, als die er uberhaupt is, en niet te vergeten, verkeerd ingestelde klokken of out of sync lopende computers in een netwerk. En dan heb je ook nog eens dat je moet opletten bij inlezen van bv datums uit bestanden dat ze in het goede formaat staan, want amerikanen schrijven hun verkorte datum anders dan wij, je mag dan hopen dat het altijd in ISO is weggeschreven.
Om even advocaat van de duivel te spelen: als deze bug maar 1 dag per (bijna) 4 jaar voorkomt, dan is dat (bijna) 6 uur per jaar gemiddeld. Kan goed zijn dat dat gewoon voldoet aan de afgesproken SLA, waardoor zo'n bug simpelweg niet genoeg prioriteit gaat krijgen en nooit opgelost gaat worden.
Kan zeker, maar anderzijds kan er ook een significante hoeveelheid benzine, diesel, gas en wie weet waterstof en stroom worden verkocht in 6 uur, bij misschien wel honderden pompstations. Alle pompstations die ik ken zijn al voorzien van een optie om software op afstand bij te werken, dus dat hoeft op nauwelijks iets extra te kosten. Daarnaast is er zoiets als reputatie. Ook als een update financieel niets oplevert, wil je toch voorkomen dat klanten een slechte indruk van je krijgen. Misschien is dat de opdrachtgever wel een dagje extra debuggen waard.
Het reputatieprobleem kun je omzeilen met vendor lock-in :)
Het is niet zozeer de reputatie bij de klant van de software, maar meer de reputatie van de pompstations bij de klant van de peut :P Die is vrij lastig fabrikant-afhankelijk te maken.
Hier in Zweden bij een grote supermarktketen ICA kan niet betaald worden met debit/creditkaart door schrikkeldag. Ze hebben wel andere digitaal alternatief (Swish) of contant.
https://www.dn.se/direkt/...inte-att-betala-med-kort/
https://www.aftonbladet.s.../betalningsproblem-pa-ica

[Reactie gewijzigd door GenomDalar1983 op 25 juli 2024 00:30]

bijzonder toch.. Het is niet alsof de schrikkeldag een nieuw fenomeen is.
ik vrees dat uitbesteding van de verantwoordelijkheid en de uitvoering ten grondslag ligt.
"If you pay peanuts, you'll get monkeys"
Het is wel iets dat maar eens per 4 jaar optreed, en genoeg software die non-stop aanpassingen krijgt.

En als je dan ergens een simpele 'new date(now.year+1, now.month, now.day)' doet dan gaat dat goed op de andere 4x365 dagen...
Goh - bij betalingssystemen verwacht ik nu toch wel een test suite waarbij je al die rare datums er toch ook doorheen jaagt.

Want je spreekt al heel snel over een heel groot bedrag.
Het zijn zoveel gekke data en tijden dat het bijna onbegonnen werk is. Zo zijn we bij tweakers wel eens een keer tegen de 2de wereldoorlog aangelopen omdat toen de tijd op 16 mei 1940 met 1h40m werd verzet waardoor een bepaalde berekening 20 minuten afweek..
Dan moet je het wel goed doen:

now = new Date()
# 'Thu Feb 29 2024 18:12:21 GMT+0100 (Midden-Europese standaardtijd)'
new Date(1900 + now.getYear() + 1, now.getMonth(), now.getDate())
# 'Sat Mar 01 2025 00:00:00 GMT+0100 (Midden-Europese standaardtijd)'

Gaat perfect goed..... toch.....???

Damn you javascript |:(

[Reactie gewijzigd door jorisvergeerTBA op 25 juli 2024 00:30]

Ik vind het inderdaad wel een zwaktebod, zeker als het om financiële software gaat. Je moet toch uit kunnen gaan dat je administratie in orde is en als de software niet eens met een datum (op een bonnetje) kan omgaan, wat kan er dan nog wel niet meer mis zijn?
Doet me denken aan de millennium bug.
Dat iedereen achteraf zei dat het een hoax was dat er van alles mis zou gaan, dat het allemaal wel mee viel. Maar ik als super junior mijn ass off hebt gewerkt om dat probleem te voorkomen.
En later echt nog wel wat millennium bugs heb gevonden.
Vooral in facturatie software zat een probleem. Bedrijven die opeens geld terug kregen in plaats van dat ze moesten betalen voor een dienst.
Ben er zojuist achter dat hier een digitale klok uit China land geen 29 februari kent. Daar is het alvast 1 maart :)
Dit illustreert weer eens goed hoeveel “prutsers” er rondlopen in IT land. Mensen die, ongetwijfeld met goede bedoelingen, in een vloek en een zucht omgeschoold zijn van vaak een niet beta opleiding naar IT “medewerker”. Maar ondertussen geen benul hebben van de achterliggende principes, (in dit geval waarschijnlijk) geen weet hebben van datum- en tijdsystemen, en zeker niet in staat zijn om de formele correctheid van een door hun geprogrammeerd algoritme aan te tonen.

Al lang geleden is er voor dit fenomeen gewaarschuwd, onder andere in Nederland door Edsger Dijkstra. Helaas tevergeefs, wat jaar na jaar alleen maar meer duidelijk wordt.
Eerste reactie toen ik vanochtend het nieuws las:

Mijn hemel, dat is ongeveer 1 van de eerste dingen die je leert in het testen van software. Kan een systeem, als er een tijd/datum afhankelijkheid in zit, functioneel, danwel technisch goed omgaan met schrikkeldag.

Maar ook, in de complexiteit van deze tijd, met meer en meer afhankelijkheden van derden, en soms flinke uitdagingen in het testbaar krijgen en houden van systemen, kan het nog een flinke puzzel zijn om het goed voor elkaar te krijgen en dit risico te mitigeren.

En met een zoontje die vandaag 8 (of 2) geworden is, heb ik ook een 'testgeval in productie' in huis rondlopen, waarbij ik echter nog maar 1 keer merkbaar problemen heb gehad.....
Het bredere stukje context achter de schrikkeldag problematiek heb ik vanochtend in een artikeltje op Linkedin geschreven, ik kan copy/pasten, maar verwijzen mag misschien ook?: https://www.linkedin.com/...ikkeldag-ide-koops-rhlhe/

Op dit item kan niet meer gereageerd worden.