2010/04/29

Jeśli używacie kompilacji z warunkową optymalizacją, może okazać się że przeoczycie błędy w waszym kodzie


size_t calc_segcnt(size_t *ret_segcnt)
{

   size_t segcnt;

   ...


   while( cond )
   {
      segcnt = blablabla
   }
   if( ret_segcnt )
         *ret_segcnt = segcnt;


   ...


}


Przy wyłączonej optymalizacji kompilacja przejdzie bez ostrzeżeń. Po włączeniu optymalizacji otrzymacie:
warning: “segcnt” may be used uninitialized in this function

Inicjalizacja segcnt jest zalezna, od „cond” który może się nie wykonać, a puzniej mamy warunkowe przypisanie pod adres wyłuskany ze wskaznika. Podczas optymalizacji widocznie kompilator chce uprościć kod i wykrywa niezainicjalizowana zmienna. Brak optymalizacji widocznie nie wywołuje kodu sprawdzającego ścieżki inicjalizacji.

2010/04/07

OOXML: Wyszlo szydło z wora

Od jakiegoś czasu M$ stara się przepchnąć format plików używany przez pakiet Office jako standard ISO. Standard zatwierdzono warunkowo co wzbudzało wiele kontrowersji.

Do tej pory M$ nie tylko nie poprawił błędów w standardzie a nawet nie przygotował wzorcowej implementacji (Nowy Office 2010 nadal używa tych samych formatów co wersja poprzednia).

Myślę że na światło dzienne wyszły prawdziwe motywy M$ (kasa za sprzedane licencje oczywistego kandydata używającego OOXML) jak i jakość jego produktów. Skoro M$ tak dba o poprawienie własnego standardu nie sądzę aby zależało im na samej standaryzacji a raczej na profitach.

Więcej informacji:
http://www.heise-online.pl/open/news/item/OOXML-format-Microsoftu-przepadl-w-testach-standaryzacyjnych-972157.html
http://www.heise-online.pl/open/news/item/ISO-odpiera-zarzuty-w-sprawie-przyjecia-OOXML-a-773080.html
http://www.heise-online.pl/open/news/item/Microsoftowy-format-OOXML-bedzie-standardem-ISO-762624.html


I na koniec coś z naszego podwórka (mądrych mamy decydentów)
http://www.heise-online.pl/open/news/item/PKN-Polska-za-OOXML-jako-standardem-ISO-762602.html

2010/04/02

64bit vs 32bit

Dzisiaj poprawiałem bugi w Dbe które ujawniły sie dopiero na 64bitowej maszynie. Dla treningu popełniłem też taki program:

#include
#include

int main()
{
    int i = -1;
    long l = i;
    unsigned long ul = i;
    enum {
        zero = 0
    };

    printf("sizeof(i) = %zi, sizeof(l) = %zi\n", sizeof(i), sizeof(l));
    printf("sizeof(zero) = %zi\n", sizeof(zero));
    printf("sizeof(size_t) = %zi\n", sizeof(size_t));
    printf("l = i -> %lx\n", l);
    printf("(long)i -> %lx\n", (long)i);
    printf("(long)-1 -> %lx\n", (long)-1);
    printf("-1L -> %lx\n", -1L);
    printf("ul -> %lx\n", ul);

    i = l;
    printf("i = l -> %x\n", i);

    return 0;
}


Wyniki:

sizeof(i) = 4, sizeof(l) = 8
sizeof(zero) = 4
sizeof(size_t) = 8
l = i -> ffffffffffffffff
(long)i -> ffffffffffffffff
(long)-1 -> ffffffffffffffff
-1L -> ffffffffffffffff
ul -> ffffffffffffffff
i = l -> ffffffff

Natrafiłem też na taki dokument: http://www.ibm.com/developerworks/library/l-port64.html. Oto ciekawsze fragmenty:

Declarations
To enable your code to work on both 32-bit and 64-bit systems, note the following regarding declarations:
  • Declare integer constants using "L" or "U", as appropriate.
  • Ensure that an unsigned int is used where appropriate to prevent sign extension.
  • If you have specific variables that need to be 32-bits on both platforms, define the type to be int.
  • If the variable should be 32-bits on 32-bit systems and 64-bits on 64-bit systems, define them to be long.
  • Declare numeric variables as int or long for alignment and performance. Don’t try to save bytes using char or short.
  • Declare character pointers and character bytes as unsigned to avoid sign extension problems with 8-bit characters.
Expressions
In C/C++, expressions are based upon associativity, precedence of operators and a set of arithmetic promotion rules. To enable your expression to work correctly on both 32-bit and 64-bit systems, note the following rules:
  • Addition of two signed ints results in a signed int.
  • Addition of an int and a long results in a long.
  • If one of the operands is unsigned and the other is a signed int, the expression becomes an unsigned.
  • Addition of an int and a double results in a double. Here, the int is converted to a double before addition.

Bit shifting
Untyped integral constants are of type (unsigned) int. This might lead to unexpected truncation while shifting.
For example, in the following code snippet, the maximum value for a can be 31. This is because the type of 1 << a is int.
long t = 1 << a;
To get the shift done on a 64-bit system, 1L should be used as shown below:
long t = 1L << a; 


Oraz taki dokument http://www.unix.org/version2/whatsnew/lp64_wp.html gdzie można znaleźć uzasadnienie dla modelu LP64:

2012

Strach, terror, ogień i flaki ... 2012 nadchodzi.
A tak poważnie to czemu akurat 2012. Z powodu jakiś indiańców po których został tylko kalendarz zawijający się na 2012?

W dobie wszechobecnej informatyzacji bardziej obawiał bym się innych dat.
http://www.ibm.com/developerworks/library/l-port64.html
"In Linux, dates are expressed as signed 32-bit integers representing the number of seconds since January 1, 1970. This turns negative in 2038"
http://en.wikipedia.org/wiki/Year_2038_problem

Pomyśl więc zanim kupisz nowa lodówkę lub mikrofalówkę z systemem operacyjnym. (Słyszałem nawet ze Linux będzie instalowany w spłuczkach toaletowych). 19 stycznia 2038 o 3:14 możesz być zaskoczony gdy zabraknie prądu w gniazdku i wody w kranie (w toalecie też zabraknie więc nie myśl że to cię uratuje :D).

Tak więc ludzkości, oto jaki zgotowałaś sobie los ...

Update: przejście na 64bitowe systemy tylko odroczy ten problem do 4 Grudnia roku 292,277,026,596 !!! Apokalipsa! :)

Powrót do przeszłości ?

Mam wrażenie że pojęcie komputera osobistego coraz bardziej nabiera na znaczeniu. Wydarzenia takie jak ewenement "iPada" czy nowe technologie w procesorach (optoelektronika) coraz wyraziściej zaznaczają przepaść między wydajnością komputerów osobistych a serwerów. Jeszcze parę lat temu te same  komponenty były używane do budowy serwerów czy całych gridów jak i desktopów. Obecnie wracamy do korzeni. Małe osobiste komputerki służące jako maszyny do pisania kontra super wydajne centra obliczeniowe zajmujące całe pomieszczenia. I nie chodzi mi o to że takie systemy nie istniały w latach 90, raczej o to, jak były popularne. Jeszcze kilka lat temu każda większa firma posiadała własną serwerownie, obecnie jest to po prostu nieopłacalne. Po co zatrudniać ludzi i kupować sprzęt skoro można wydać połowę kwoty i wydelegować nasze aplikacje do chmury ?
Idąc za modnym hasłem jednego z producentów "komputer osobisty jest teraz naprawdę osobisty" a w najbliższych latach sądzę że będzie tylko terminalem lub prostą maszyna do pisania.

Aby posłużyć się przykładem:
http://openzone.pl/news,twoje-dane-w-chmurze-czym-jest-cloud-computing,2574
http://www.heise-online.pl/newsticker/news/item/Intel-przedstawia-osmiordzeniowy-procesor-serwerowy-968106.html

Pierwsze wrażenie ... hmmm sami oceńcie za ile lat będziecie mieli do dyspozycji 1TB RAMu obsługiwany przez jeden tylko procesor ? ;)
Dlatego właśnie ... mamy powrót do przeszłości :)

Na koniec konkursik:
IBM System/370 rok 1971


Peak Server Room, czas obecny
Znajdź różnice ;)