1. april-feil i Windows

En feil i Windows gjør at mange Windows-applikasjoner vil vise feil tid i en periode som starter den 1. april 2001.

Feilen i Windows kan få applikasjoner i operativsystemet til å vise feil tid selv om klokken i operativsystemet er korrekt innstilt. Tidsfeilen vil alltid utgjøre én time og vil oppstå i Windows 95, Windows 98 og Windows NT.

Problemet skyldes at runtime-bibliotektet i Visual C++ forvirres og tror at sommertiden i år 2001 ikke starter før 8. april. I virkeligheten starter sommertiden den 1. april. Ifølge Richard M. Smith, utvikleren som har oppdaget dette og varslet om feilen på NTBUGTAQ-listen, virker det som feilen oppstår fordi den 1. april faller på en søndag i år 2001.

Den samme feilen oppstår også i forbindelse med andre år hvor den 1. april faller på en søndag, det vil si i blant annet 1990 og i 2007.

Microsoft har bekreftet feilen som ligger i MSVCRT.DLL-filen. Selskapet opplyser derimot ikke når en feilfiks vil bli klar.

Applikasjoner som er statisk lenket til runtime-bibliotekene i Visual C++, vil ikke påvirkes av at feilen i MSCVRT.DLL-filen rettes. Slike applikasjoner må derfor rettes av produsenten og sendes ut til brukerne, enten som en ny utgave av applikasjonen eller som en patch.

Feilen er foreløpig kun testet mot amerikansk EST (Eastern Standard Time), men følgende program ser ut til å vise at problemet ikke inntreffer på samme tid i vår tidssone. Smith er derfor usikker på om problemet eksisterer utenfor Nord-Amerika. Hvis det eventuelt eksisterer, mener han at det kan opptre på andre datoer og i andre år.

// APRIL1.C -- Simple test program for the "April's Fools 2001" bug
//
// by Richard M. Smith (rms@pharlap.com)
// copyright (C) 1999
//

#include <stdio.h>
#include <time.h>
#include <string.h>

#define SECS_PER_HOUR (60 * 60)
#define SECS_PER_DAY (24 * SECS_PER_HOUR)
#define SECS_PER_YEAR (365 * SECS_PER_DAY)

#define START (3 * SECS_PER_DAY)
#define INCR (23 * SECS_PER_HOUR)
#define MAXTIMES ((0x80000000L - START) / INCR)

void print_time(time_t mytime);

char *month_tab[] =
{
"January",
"February",
"March",
"April",
"May",
"June",
"July",
"August",
"September",
"October",
"November",
"December"
};

char *dow_tab[] =
{
"Sunday",
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday",
"Saturday"
};

int main()

{

print_time(0x3AC796D0); // Sunday, April 1, 2001
print_time(0x3ACF2B70); // Saturday, April 7, 2001
print_time(0x3AD06EE0); // Sunday, April 8, 2001
return 0;

}

//
// print_time -- print out a time_t value converted by localtime()
//

void print_time(time_t mytime)

{

char month[100];
char dow[100];
struct tm *tmp;

tmp = localtime(&mytime);
if(tmp == NULL)
{
printf("0x%08lX = Invalid time\n", mytime);
return;
}
if(tmp->tm_mon >= 0 && tmp->tm_mon <= 11)
strcpy(month, month_tab[tmp->tm_mon]);
else
sprintf(month, "BadMonth=%d", tmp->tm_mon);
if(tmp->tm_wday >= 0 && tmp->tm_wday <= 6)
strcpy(dow, dow_tab[tmp->tm_wday]);
else
sprintf(month, "BadDOW=%d", tmp->tm_wday);
printf("0x%08lX = %s, %s %d, %d -- %d:%02d:%02d %s -- DOY=%d\n",
mytime, dow, month, tmp->tm_mday, tmp->tm_year + 1900,
tmp->tm_hour, tmp->tm_min, tmp->tm_sec, _tzname[tmp->tm_isdst != 0],
tmp->tm_yday);
return;

}

Til toppen