8 sierpnia 2014

[C++11] nullptr

W C/C++ przyjęło się oznaczać pusty wskaźnik przez NULL, jednak identyfikator ten zostanie rozwinięty i tak do 0. Może to doprowadzić do pewnej niejednoznaczności, gdy posiadamy dwie przeciążone funkcje:
int foo(int);
int foo(char *);
Jeżeli NULL zostanie rozwinięte do 0L (ponieważ standard nie gwarantuje, że będzie to 0 - 32bity), to w takim przypadku nie mamy pewności, która metoda zostanie zawołana. Nowy standard wprowadza nowe słowo kluczowe nullptr (będące typu std::nullptr_t). Stała ta nie może być przypisywana ani porównywana z typami całkowitymi, może jednak porównywać ją z dowolnym typem wskaźnikowym.

Źródła:

7 sierpnia 2014

[Windows] Defrag Toos - sysinternals konfiguracja

Zbiór fajnych podcastów na temat diagnozowania problemów w Windowsie, za pomocą narzędzi sysinternals. Aby uzyskać lepszą diagnostykę niezbędna jest instalacja "Microsoft Windows SDK for Windows 7 and .NET Framework 4", w którym to znajduje się się lepsza wersja dbghelp.dll.
Oczywiście nie obyło się bez problemów. Po pierwsze, trzeba było odinstalować "Microsoft Visual C++ 2010 x86 Redistributable", aby w ogóle doprowadzić do instalacji (doprowadziły mnie do tego fail logi).
Po drugie nie wszystkie narzędzie z SDK rozpakowują się tam, gdzie to zostało wskazane, większość i tak wędruje do Program Files.

Interesują nas narzędzie dostępne w "Redistributable Packages" (czyli Microsoft Visual C++ 2010, Application Verifier, Debbuging Tools, Windows Performance Toolkit). Jednak SDK ściągnie jedynie instalatory. Nas interesują instalatory debbugera dla wersji 32 i 64 bitowej.
c:\Program Files\Microsoft SDKs\Windows\v7.1\Redist\Debugging Tools for Windows\dbg_amd64.msi
c:\Program Files\Microsoft SDKs\Windows\v7.1\Redist\Debugging Tools for Windows\dbg_x86.msi
Można je zainstalować w dowolnej lokalizacji. Każda posiada odpowiednią wersję dbghelp.dll, która będzie nam potrzebna - można ją nawet przekopiować na USB (diagnostyczny) z innymi narzędziami sysinternals.

Niektóre z narzędzi (jak Process Explorer) potrafią pokazywać jakie biblioteki dll, są załadowane przez dany proces do pamięci. Przydać się mogę symbole debbugjące dostępne do Microsoftu. Ścieżki, gdzie będą przechowywane, można ustawić za pomocą poniższego skryptu. Ważne są też zmienne środowiskowe (które zdaje się, są również wykonywane przez inne tego typu programy). Magiczne SRV, z tego co zrozumiałem, ustawia przeszukiwanie najpierw w lokalnym katalogu, a jeżeli ich tam nie znajdzie, ściąga symbole z serwera i robi ich backup w lokalnym katalogu (działanie magicznych gwiazdek).

Symbols.cmd:
md c:\My
md c:\My\Src
md c:\My\Sym
md c:\My\SymCache
setx /M _NT_SOURCE_PATH SRV*C:\My\Src
setx /M _NT_SYMBOL_PATH SRV*C:\My\Sym*http://msdl.microsoft.com/download/symbols
setx /M _NT_SYMCACHE_PATH C:\My\SymCache
pause

Drugi skrypt podawany przez autorów, służy do drukowania większej ilości detali (jeżeli dobrze zrozumiałem) - nie testowałem. Informacje na stronie mówią, że może to spowolnić wczytywanie symboli, więc warto włączać flagę tylko, gdy jest to uzasadnione.

DbgHelp_Logging.cmd:
rem msdn.microsoft.com/en-us/library/windows/desktop/ms680687.aspx
md c:\My
md c:\My\DbgHelp
setx DBGHELP_DBGOUT 1 
setx DBGHELP_LOG C:\My\DbgHelp\DbgHelpLog.txt
pause

6 sierpnia 2014

clang-format

clang-format.py umożliwia zmianę formatowania pliku (C++) według przyjętej w danym projekcie konwencji. Pokrótce omówił to narzędzie Chandler Carruth w swoim wykładzie na GoingNative 2013 (25 minuta):
Potrafi on korzystać z kilku wbudowanych styli: Google, WebKit, llvm. Możliwe jest także skorzystanie z własnego, za pomocą przełącznika -style=file. Styl taki zostanie zaczytany z pliku .clang-format, który musi znajdować się gdzieś w ścieżce powyżej wywołania. Własny styl można zbudować, na podstawie już istniejącego, najpierw zrzucając oryginał (--dump-config) go pliku, a następnie modyfikując.
# użyj wbudowanego stylu
clang-format-3.5 -style=WebKit -i main.cpp

# zrzuć styl Google do pliku .clang-format
clang-format-3.5 -style=Google --dump-config > .clang-format

# skorzystaj z własnego stylu
clang-format-3.5 -style=file -i main.cpp
Działanie formatera, można zautomatyzować np. w QtCreatorze. Jedna uwaga, wszelkie modyfikacje w:
"Tools | Options... | Environment | External Tools | Add | Add Tool", kasują skrót klawiaturowy, który został podpięty dla takiego formatera.

5 sierpnia 2014

[gcc + tutorial] x86 Assembly

Zobaczyłem fajny przełącznik (-masm) do gcc, który wyrzuca kod asemblera bardziej przypominający MASM niż NASM.
gcc main.cpp -S -masm=intel
Tutorial do asemblera x86:

4 sierpnia 2014

4 lipca 2014

[Notki] Praca w terminalu z tmux-em.

Bardzo fajny artykuł Łukasza Wróbla na temat pracy z tmux-em. Fajne narzędzie do podziału terminala na kilka paneli. Nie jest to wciąż coś czego poszukuje, ale na razie wystarcza:
Po wciśnięciu Ctrl+b program przechodzi do trybu kontroli. Notki:
  • Ctrl+b " - split horyzontalnie
  • Ctrl+b % - split wertykalnie
  • Ctrl+b strzałka - przełączenie między panelami
  • Ctrl+b+strzałka - zmiana rozmiaru panelu
  • Ctrl+b PgUp/PgDn - skrolowanie w panelu (aby wyłączyć ten tryb "q")