2010/08/25

Rozmowa kwalifikacyjna

Pytania z serii "rozmowa kwalifikacyjna"

jaka jest różnica między poniższymi deklaracjami tab

int function(int tab[])
{
...
}

struct SomeStruct_T
{
   int tab[];
};

Odpowiedz:
deklaracja w parametrze funkcji nie alokuje pamięci na stosie, jest ona równoważna z deklaracja function(int *tab)
deklaracja w strukturze również nie alokuje pamięci ale dostęp do pola tab będzie się odbywał poprzez referencje do pamięci znajdującej sie bezpośrednio za struktura, w ten sposób można tworzyć np tablice o zmiennej długości pamiętając o alokowaniu odpowiedniej ilosci pamięci, np na stercie.

jaka jest roznica miedzy poniższmi deklaracjami field

struct SomeStruct
{
   union field
   {
      int a;
   };
}

struct SomeStruct
{
   union
   {
      int a;
   } field;

}

Odpowiedz:
pierwsza to czysta deklaracja unii o nazwie field, struktura nie allokuje przestrzeni na zadne pole
druga to deklaracja pola field o typie unii anonimowej, struktura będzie miała rozmiar sizeof(int)

2010/07/06

Dlaczego zamkniete oprogramowanie jest passé

Oto odpowiedz dlaczego producenci oprogramowania powinni gwarantować bezpieczeństwo swoich produktów. Kto wie ... może kiedyś :)

http://www.heise-online.pl/newsticker/news/item/Luki-Microsoftu-raz-Full-Disclosure-a-raz-Null-Disclosure-1033694.html

2010/06/29

SIGSEGV

Gdyby ktoś potrzebował kodu obsługującego SIGSEGV w aplikacji:

gcc -rdynamic

#define _GNU_SOURCE
#include
#include
#include
#include

----------- SIGSEG!!! -----------
Fault addr [0x00000001] in function [0x00416d94] FKT_BL_Creat+0x32
-------- Backtrace start --------
Obtained 8 stack frames.
0 : [0x00408018] pthread_create+0x2d2
1 : [0x2956e420] __kernel_rt_sigreturn+0x0
2 : [0x00416d94] FKT_BL_Creat+0x32
3 : [0x00415fcc] Fkt_Tuning_Init+0x90
4 : [0x00408018] pthread_create+0x8d8
5 : [0x00408018] pthread_create+0x654
6 : [0x0043123c] unresolved
7 : [0x2958559e] unresolved
Aborted

static void sigseg_hndlr(int unused(signum), siginfo_t* siginfo, void* ucont)
{
   void * array[50];
   size_t size;
   size_t i;
   ucontext_t *ucontext = (ucontext_t*)ucont;
   void* pc = (void*)(ucontext->uc_mcontext.gregs[REG_EIP]); /* for x86 */
   Dl_info dlinfo;

   printf("----------- SIGSEG!!! -----------\n");
   if( dladdr(pc, &dlinfo) && (NULL != dlinfo.dli_sname) )
      printf("Fault addr [0x%08x] in function [0x%08x] %s+0x%x\n", (unsigned int)(siginfo->si_addr), (unsigned int)(dlinfo.dli_saddr), dlinfo.dli_sname, pc - dlinfo.dli_saddr );
   else
      printf("Fault addr [0x%08x] in function [0x%08x] unresolved\n", (unsigned int)(siginfo->si_addr), (unsigned int)(pc));

   printf("-------- Backtrace start --------\n");
   size = backtrace(array, 50);
   printf ("Obtained %zd stack frames.\n", size);
   for (i = 0; i < size; i++)
   {
      if( dladdr(array[i], &dlinfo) && (NULL != dlinfo.dli_sname) )
         printf("%d : [0x%08x] %s+0x%x\n", i, (unsigned int)(dlinfo.dli_saddr), dlinfo.dli_sname, array[i] - dlinfo.dli_saddr );
      else
         printf("%d : [0x%08x] unresolved\n", i, (unsigned int)(array[i]));
   }

   fflush(stdout);
   abort();
}


int main(int argc, char* argv[])
{
   SAL_Config_T sal_config;
   SAL_Thread_Attr_T thread_attr;
   int retv = -1;

   sigaction(
      SIGSEGV, /* int signum, */
      &sigsegact, /* const struct sigaction *act, */
      NULL /* struct sigaction *oldact */ );
}

2010/06/25

.Niet

Wyobraź sobie świat, w którym nie mógł byś naprawiać rzeczy które cię otaczają ? Weźmy np twój samochód, wyobraź sobie że właśnie się zepsuł i jedynym sposobem aby go naprawić, jest oddanie do warsztatu. Nie jesteś w stanie zdobyć żadnych rysunków czy schematów. Zepsuł ci się odkurzacz? masz pecha, bo nie da się go otworzyć i naprawić, musisz czekać 2 tygodnie na serwis.

Co w tym dziwnego, skoro tak właśnie zaczyna działać rynek? Moim zdaniem to wygodnictwo, przyzwyczaja nas do "niemyślenia". Nie musisz wiedzieć jak coś jest skonstruowane, żeby tego używać, ale gdy skończy się gwarancja, skazany jesteś na zakup nowego produktu.

Po co ten wywód ? Ot tak właśnie działa obecny rynek oprogramowania. Od 4 kwietnia nie istnieje wsparcie dla Windows Xp a łatki bezpieczeństwa wydawane będą do 4 sierpnia 2014r. Długo ? Weźmy pod uwagę nowy sprzęt. Już teraz widać jak Xp odstaje. Nie zobaczymy na nim DirectX 10 ani sterowników USB3.0. Zapomnij więc np o nowych kartach graficznych i szybkich pamięciach przenośnych. Tak właśnie M$ zmusza nas do kupowania nowych produktów, aby zachować ciągłość przychodów.
Niepokojące jest też to, że firmy takie jak M$ wypuszczają własne produkty przeznaczone dla programistów: biblioteki i narzędzia. Przykładem niech będzie Apple i ich framework do iPhone. Chcesz sprzedawać swoje produkty ? musisz kupić nasze biblioteki? To jest naprawdę chore, nie dość że dobrowolnie zgadzam się na wsparcie waszej technologi, to jeszcze muszę opłacać jakiś haracz ? To samo jest z .Niet Mobile. Albo kupujesz M$ Visual Studio w wersji Professional, albo piszesz w notatniku :). Masakra ... niedługo może będę musiał płacić za poprawki bezpieczeństwa ?

Zmierzając do meritum, dlaczego nie lubię .Niet ? Podobnie jak z oprogramowaniem użytkowym i porównaniem do obecnego trendu rynku konsumenckiego jesteś skazany na używanie "jednego słusznego API". Dokumentacja też pozostawia wiele do życzenia. Pomijając cała masę bugów które uprzykrzały mi życie przez ostanie 2 lata, .Niet jest strasznie niewygodny (API jest jakieś skrzywione). Cokolwiek chcesz zrobić "po swojemu" wbrew "jedynej słusznej drodze", napotykasz problemy.

Dlaczego lubię OpenSource ? Ponieważ nigdy nie czujesz się skrepowany, masz pełny dostęp do źródeł. Jeśli coś nie działa tak jak chcesz, zawsze możesz przerobić API, poprawić błąd w bibliotece lub poprostu "zobaczyć pod maskę". O to właśnie chodzi w programowaniu, o radość płynąca z uczenia się na błędach, modyfikacji i wzorowaniu się na pracy innych. Do niczego nie jesteś zmuszany. Nie odpowiada ci jakaś biblioteka ? jest tysiące innych. Tak właśnie powstają dobre standardy, nikt ich nie narzuca, one same "wypływają na wierzch" bo są po prostu dobre. To nie jest .Niet "jedynie słuszna droga". Co więcej, jeśli masz odmienny pomysł na rozwiązanie danego problemu, możesz podzielić się nim z innymi. Ciągłe doskonalenie i wymiana doświadczeń jest podstawa idei OpenSource.

Ludzie którzy głoszą "nie da się zarobić na otwartym oprogramowaniu" są dla mnie fanatykami. Moja firma już od kilku lat współpracuje z firmami oferującymi support dla produktów OpenSource, a nawet zatrudniamy programistów ze świata OpenSource, aby dla nas przygotowali modyfikacje ich kodu. OpenSource nie oznacza FreeSoftware jak większości się wydaje.

Dlaczego o tym pisze ? Bo dziwi mnie ze tak wielu programistów dobrowolnie oddaje swoje "samochody" i "odkurzacze" do serwisu. Godzą się na to, zamiast być ciekawym (moim zdaniem podstawowa cecha dobrego programisty). Nie zadają sobie pytania "dlaczego?" tylko "kiedy?". "Kiedy ten problem zniknie żebym mógł skończyć moją robotę" albo "Jak ominąć ten BUG żeby to jednak działało" i tak od przypadku do przypadku.
Niepokojące jest też to, że duże firmy IT zachęcają studentów do uczenia się i używania swoich produktów, aby już na starcie ich kariery zapewnić sobie przyszłych klientów. Oni przecież będą używać tych bibliotek, produkować swoje oprogramowanie bazując na tych technologiach. Przez takie programy jak MSDNAA, M$ niskim kosztem zapewnia sobie bardzo dobrą pozycje na rynku. Uważam to za złą praktykę jakiekolwiek są z tego korzyści dla studentów. To samonapędzający się mechanizm. .Niet jest popularny, więc znać go wypada (może przyda się w przyszłej pracy). A później chcąc nie chcąc, wracamy do tego co już znamy i popularyzujemy dalej, napędzając kasę do kieszeni M$. Nie wiem dlaczego, ale na moich studiach nie było zajęć, na których omawiano by biblioteki/rozwiązania OpenSource. Dlatego właśnie uważam to za szkodę dla samych studentów.

Na studiach wydawało mi się że, OpenSource to coś lepszego. To słowo miało w sobie jakąś wyższą idee, którą (czasami na siłę) starałem się przekazać innym :). Dzisiaj mogę z czystym sumieniem powiedzieć że na OpenSource nie trzeba "nawracać", tym się po prostu zaraża :). Wszystkie moje znaczące projekty które oparłem na OpenSource zaliczam do sukcesów, te oparte na rozwiązaniach komercyjnych do mniejszych lub większych porażek. Moja ocena wynika z czystej kalkulacji czasu i nerwów jakie poświęciłem.

Słowo kończące: możesz się nie zgadzać z opiniami tu wyrażonymi, jeśli wygodnie ci z M$ po prostu zostań tam gdzie jesteś :)

EDIT: heh ... nie tylko ja jestem zdania ze .Niet :D, oto wersja multimedialna ... .Not https://www.youtube.com/watch?v=RnqAXuLZlaE

2010/06/22

Odruch wymiotny M$ patch instalatora

Dzisiaj wyskoczył mi monit o zainstalowanie latki  KB976576. Widziałem już rożne głupoty M$, ale ta jest wyjątkowo polityczna :)

"Zainstalowanie tej aktualizacji pozwala uniknąć konieczności ponownego uruchamiana systemu w większości przypadków po zainstalowaniu programu .NET Framework 4 i nowszych wersji. Występują pewne znane problemy z podkładkami zawartymi w programie .NET Framework 2.0 z dodatkiem Service Pack 2, które uniemożliwiają im poprawne przekierowywanie wywołań do odpowiedniej wersji programu .NET Framework. W wyniku tego aplikacje utworzone z zastosowaniem nowszych wersji programu .NET Framework, na przykład programu .NET Framework 4, wymagają zaktualizowania tych często używanych podkładek, co skutkuje wymaganiem ponownego uruchomienia systemu. Po zainstalowaniu tego elementu może być konieczne ponowne uruchomienie komputera."

Restartować czy nie restartować, ot nie mogę się zdecydować :P


Sztuczny bełkot zamiast rzeczowego opisu problemu. Nie wiem kto zawinił, tłumacz czy autor tego tekstu, ale z powyższego opisu nie sposób wywnioskować czego naprawdę dotyczy łatka. W każdym razie jeśli mieliście ostatnimi czasy problemy z łatkami które mimo instalacji ciągle wracały, to (o ile tym razem wierzyć M$) ta poprawka ma zakończyć wasze męki :)

2010/05/24

Windows GDI, czyli jak nowe jest lepsze niż stare

Taki oto news przeczytałem:

http://www.heise-online.pl/security/news/item/Microsoft-ostrzega-przed-krytyczna-luka-w-64-bitowej-wersji-Windows-7-1003325.html

Z jednej strony BUG, z drugiej wymijające tłumaczenie M$ które można przeczytać na tej stronie:
http://www.microsoft.com/technet/security/advisory/2028859.mspx

Ciekawsze fragmenty:
What is the Canonical Display Driver (cdd.dll)?
The Canonical Display Driver (cdd.dll) is used by desktop composition to blend GDI and DirectX drawing. CDD emulates the interface of a Windows XP display driver for interactions with the Win32k GDI graphics engine.

Czyli nie tylko ja pisze nowe, lepsze, szybsze :D

oraz:
What might an attacker use this vulnerability to do?
In most scenarios, an attacker who successfully exploited this vulnerability could cause the affected system to stop responding and automatically restart.

Why is code execution unlikely for this issue?
An attacker who attempts to exploit this issue for code execution would need to write executable content to a specific space in kernel memory. However, since the starting address will be random, the final pointer destination will be difficult to predict. The implementation of Address Space Layout Randomization (ASLR) by default on affected systems further complicates this prediction. In most scenarios, exploit code could much more likely result in a denial of service than in code execution.

What is Address Space Layout Randomization (ASLR)?
Systems implementing Address Space Layout Randomization relocate normally-predictable function entry points pseudo-randomly in memory. Windows ASLR re-bases DLL or EXE into one of 256 random locations in memory. Therefore, attackers using hardcoded addresses are likely to "guess correctly" one in 256 times. For more information regarding ASLR, visit the TechNet Magazine article, Inside the Windows Vista Kernel: Part 3.

Czyli ... drogi kliencie, kupując Windows 7 jesteś narażony na atak z dowolnej strony WWW. Znowu daliśmy d... tak jak kiedyś ze biblioteka do przetwarzania obrazów JPG (http://www.microsoft.com/technet/security/bulletin/ms04-028.mspx), ale nie przejmuj się. Mamy przecież ASLR który umieszcza kod kernela w jednym z 256 lokacji, jesteś więc bezpieczny bo dobra ściema nie jest zła.
http://www.heise-online.pl/newsticker/news/item/Nowa-metoda-exploitowa-do-omijania-ochrony-pamieci-960185.html

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.