Both sides previous revision
Poprzednia wersja
Nowa wersja
|
Poprzednia wersja
|
pl:miw:2009:miw09_hqed_audit_1 [2009/10/13 21:34] jsi08 |
pl:miw:2009:miw09_hqed_audit_1 [2019/06/27 15:50] (aktualna) |
| ~~ODT~~ |
| |
====== HQEd audit ====== | ====== HQEd audit ====== |
| |
| |
====== Projekt ====== | ====== Projekt ====== |
| |
| ===== Prezentacja ===== |
| |
| Prezentacja wyników pracy: [[pl:miw:2009:miw09_hqed_audit_1:slideshow|prezentacja]] |
| |
===== Sprawozdanie ===== | ===== Sprawozdanie ===== |
| |
==== Statyczne linkowanie ==== | ==== Statyczne linkowanie ==== |
| |
Jednym z ważnych celów projektu było statyczne zbudowanie aplikacji z Qt4. Powody są dwa: | Jednym z ważnych celów projektu było statyczne zbudowanie aplikacji z Qt4. Powody: |
| |
* Zlikwidowanie potrzeby instalowania Qt4 użytkownika końcowego, czyli duże ułatwienie dla niego; | * Zlikwidowanie potrzeby instalowania Qt4 dla użytkownika końcowego, czyli duże ułatwienie dla niego; |
* Uniknięcie problemów ze zgodnością nowych wersji Qt; | * Uniknięcie problemów ze zgodnością nowych wersji Qt; |
| |
| |
W tej kwestii udało mi się skompilować Qt4 statycznie (w wersjach: 4.2.3, 4.3.0, 4.5.2), także program dał się skompilować (rozmiar wzrósł do 5.9 MB z 3.8 MB), niestety po jego uruchomieniu otrzymałem w konsoli błąd: 'segmetion fault'. | W tej kwestii udało mi się skompilować statycznie zarówno Qt4 (w wersjach: 4.2.3, 4.3.0, 4.5.2), jak i program (rozmiar wzrósł do 5.9 MB z 3.8 MB). Niestety po jego uruchomieniu otrzymałem w konsoli błąd: 'segmetion fault'. |
| |
Kompilacja Qt4 jest bardzo czasochłonna, na moim komputerze zajmował nawet do 13h (dla wersji 4.5.2, pełna kompilacja z przykładami). | |
| |
| Kompilacja Qt4 jest bardzo czasochłonna, na moim komputerze zajmowała nawet do 13h (dla wersji 4.5.2, pełna kompilacja z przykładami). |
==== Audyt kodu ==== | ==== Audyt kodu ==== |
| |
=== Dostęp do CVS-a === | === Dostęp do CVS-a === |
Dużym problemem dla projektu były problemy z dostępem do CVS-a. Quota na koncie na Charonie była mniejsza niż zajmował pełny kod źródłowy na CVS-ie. Dodatkowo w pewnym momencie ten dostęp został zablokowany. Brak pełnego dostępu do CVS-a spowodował, że z pewnych rzeczy trzeba było zrezygnować jak: bezpośrednie poprawianie warningów, czy jakiekolwiek zajmowanie się komentarzami. | Dużym utrudnieniem dla projektu był problem z dostępem do CVS-a. Quota na koncie na Charonie była mniejsza niż zajmował cały kod źródłowy na CVS-ie. Dodatkowo w pewnym momencie dostęp ten został zablokowany. Brak pełnego dostępu do CVS-a spowodował, że z pewnych rzeczy - takich jak bezpośrednie poprawianie ostrzeżeń kompilacji czy jakiekolwiek zajmowanie się komentarzami - trzeba było zrezygnować. |
| |
=== Analiza ostrzeżeń kompilacji === | === Analiza ostrzeżeń kompilacji === |
Tych ostrzeżeń kompilator wykrył aż 82, poprawa kodu sprowadza się do zmiany: | Tych ostrzeżeń kompilator wykrył aż 82, poprawa kodu sprowadza się do zmiany: |
| |
z: void fun(..., int param, ...) | było: void fun(..., int param, ...) |
do: void fun(..., int, ...) | jest: void fun(..., int, ...) |
| |
Należy nie zapomnieć o pozostawieniu samego parametru, gdyż mogą istnieć wywołania funkcji z tym parametrem, które spowodują błąd kompilacji. | Należy nie zapomnieć o pozostawieniu samego parametru, gdyż mogą istnieć wywołania funkcji z tym parametrem, które spowodują błędy kompilacji. |
| |
== niebezpieczna konwersja == | == niebezpieczna konwersja == |
Kompilator wskazał 12 linijek z tym błędem, jednak sprowadzało się do zmiany w 2 linijkach: | Kompilator wskazał 12 linijek z tym błędem, jednak sprowadzało się do zmiany w 2 linijkach kodu: |
| |
było: char* cFormats[] = {"...", "...", "...", "..."} | było: char* cFormats[] = {"...", "...", "...", "..."} |
teraz jest: const char *cFormats[], | jest: const char *cFormats[], |
| |
Wcześniejszy zapis umożliwiał zmianę czegoś zadeklarowanego jako stałe (niejawna konwersja z 'const char *' do 'char *'). | Wcześniejszy zapis umożliwiał zmianę czegoś zadeklarowanego jako stałe (niejawna konwersja z 'const char *' do 'char *'). |
| |
== niezainicjowana zmienna == | == niezainicjowana zmienna == |
11 wystąpień. Tu trzeba zainicjować zmienną, ustawić na 0, NULL lub jakąś inną początkową wartość. | 11 wystąpień. Tu trzeba było zainicjować zmienną, ustawić na 0, NULL lub jakąś inną początkową wartość. |
| |
== Błędne nawiasowanie == | == Błędne nawiasowanie == |
3 ostrzeżenia. Chodziło o to, żeby iloraz logiczny wziąć w nawiasowanie, co zapewnia czytelność: | 3 ostrzeżenia. Chodziło o to, żeby iloraz logiczny wziąć w nawiasowanie, co zapewnia czytelność: |
dla: | |
było: ((s && r)) || q && p | było: ((s && r)) || q && p |
powinno być: (s && r) || (q && p) | jest: (s && r) || (q && p) |
i | i |
jest: t && (s && r) || (q && p) | było: t && (s && r) || (q && p) |
powinno: (t && s && r) || (q && p) | jest: (t && s && r) || (q && p) |
| |
Tu dokładność kompilatora okazała się bardzo potrzebna, bo okazało się, że jedno z nawiasowań jest logicznie błędnym rozumowaniem. | Tu dokładność kompilatora okazała się bardzo potrzebna, bo okazało się, że jedno z nawiasowań było logicznie błędnym rozumowaniem. |
| |
== Brak klamr == | == Brak klamr == |
To dwa najważniejsze ostrzeżenia, które okazały się błędami logicznymi w programie. | To dwa najważniejsze ostrzeżenia, które także okazały się błędami logicznymi w programie. |
| |
| * Umiejscowienie średnika w tym miejscu powodowało, że wszystko w klamrach wykona się niezależnie od spełnienia warunków if-a. |
| |
- Niepotrzebny średnik | |
Pierwsze dotyczyło niepotrzebnego średnika | |
| |
było: | było: |
if(...); | if(...); |
... | ... |
} | } |
zamiast: | jest: |
if(..) | if(..) |
{ | { |
} | } |
| |
- brak klamr | * Brak klamr w tym miejscu powodował, że else z poziomu niższego odnosił się do if-a o poziom wyżej. |
| |
if(...) | było: |
if(...) | if(...) |
{ | if(...) |
... | { |
} | ... |
else | } |
{ | else |
... | { |
} | ... |
| } |
| jest: |
| |
if(...) | |
{ | |
if(...) | if(...) |
{ | { |
... | if(...) |
} | { |
else | ... |
{ | } |
... | else |
| { |
| ... |
| } |
} | } |
} | |
| |
| |
=== Błąd kompilacji === | === Błąd kompilacji === |
| |
Jedyny błąd kompilacji okazał się zależny od wersji qt. Skompilowanie programu w wersji qt 4.3.0 i niższej: 4.2.3 błędu nie pokazuje, natomiast pojawia się on przy wersjach 4.4.3 i wyższych. Błąd pojawiał się w plikach generowanych automatycznie z plików QTDesignera. Po edycji tych plików, problem zgodności został rozwiązany. | Jedyny błąd kompilacji okazał się zależny od wersji qt. Skompilowanie programu w wersji qt 4.3.0 i niższej: 4.2.3 błędu nie pokazuje, natomiast pojawia się on przy wersjach 4.4.3 i wyższych. Błąd pojawiał się w pliku generowanym automatycznie z plików QTDesignera. Po edycji tych plików, problem zgodności został rozwiązany. |
==== Testowanie Aplikacji ==== | ==== Testowanie Aplikacji ==== |
| |
| === Konfiguracja na której testowana była aplikacja === |
| * Ubuntu 8.10, Qt ver. 4.4.3, Gnome ver. 2.24.1 |
| * Ubuntu 9.04, Qt ver. 4.5.0, Gnome ver. 2.26.1 |
| Potem były także zmiany wersji qt na wersje: 4.3.0 i 4.2.3 (dla Ubuntu 8.10) - na nich większych testów nie przeprowadzałem. |
| |
=== Stworzone modele === | === Stworzone modele === |
| |
== Thermostat == | == Thermostat == |
| |
| Zbudowałem model termostatu na podstawie już dobrze opisanego sytemu: [[hekate:hekate_case_thermostat]]. Ponieważ problem ten został już tam dość dobrze opisany, dodam tylko, że zmieniłem miesiące tak, by odpowiadały porom roku na półkuli północnej. |
| |
| Wykonanie w HQEd (screen): |
| |
| {{:pl:miw:2009:miw09_hqed_audit_1:thermostat.png?600|}} |
| |
| Wykonanie w HQEd (plik o ściągnięcia): |
| |
| {{:pl:miw:2009:miw09_xtt_drools:thermostat.zip}} |
| |
== ATM == | == ATM == |
| |
| Zbudowałem model bankomatu zarówno na podstawie już stworzonego modelu (dostępnego w aplikacji) jak i na podstawie własnych pomysłów. Jako dane wejściowe przyjąłem: pin wprowadzony przez użytkownika, prawidłowy pin z bazy danych, deklarowaną kwotę do wypłacenia, dostępne środki na koncie oraz w bankomacie. Na podstawie tych danych program daje jedną z odpowiedzi: wypłacenie kwoty, nieprawidłowy pin, brak środków na koncie, brak środków w bankomacie. |
| |
| Wykonanie w HQEd (screen): |
| |
| {{:pl:miw:2009:miw09_hqed_audit_1:atm.png?600|}} |
| |
| Wykonanie w HQEd (plik o ściągnięcia): |
| |
| {{:pl:miw:2009:miw09_xtt_drools:atm.zip}} |
| |
=== Uwagi === | === Uwagi === |
| * Jeśli Podczas zapisywania pliku nie podamy rozszerzenia ('.hml') w nazwie (chcąc by edytor sam ją automatycznie dodał), zostanie utworzony plik o nazwie wydłużonej o 'hml' i bez roszerzenia. Dodatkowo z każdym zapisaniem program będzie tworzył kolejny plik konkatenując nazwę o 'hml', zamiast zapisywać w starym. Jeżeli wpisze się ręcznie nazwę wraz z rozszerzeniem '.hml', nie ma tego problemu. Jest to zależne od sytemu na którym używa się aplikacji. |
| * Nieintuicyjne ustawianie granic przedziału - należy najpierw zdefiniować dolny próg i dopiero wtedy zaznaczyć range (radio button cały czas aktywny) i podać górny próg, w przeciwnym razie wyskakuje błąd; |
| * Program zawsze pyta, czy zapisać zmiany - niezależnie od tego czy nastąpiły; |
| * Mało ergonomiczny interfejs – trzeba wykonać dużą ilość kliknięć aby cokolwiek wykonać; |
| * Wartość 'row' w 'cell editor' powinna zostać ograniczona - zbyt duża powoduje zakończenie programu wyjątkiem; |
| * Zakończenie pracy aplikacji wyjątkiem podczas konstruowania skomplikowanego wyrażenia. |
| * Część przeznaczona do rysowania modelu zmienia swój rozmiar dopiero po ponownym wczytaniu modelu; |
| * Tips na początku przyczepiony do nie wiadomo czego, poza oknem (może być to kwestia systemu na którym jest użytkowany); |
| |
| Program jest cały czas w trakcie tworzenia, więc tego typu uwagi często dotyczą rzeczy, których jeszcze nie zrobiono, a nie błędów. Część błędów zależy bezpośrednio od platformy i zainstalowanej na niej wersji qt4. |
| |
| |
| |
| |
===== Prezentacja ===== | |
===== Do wykonania ===== | ===== Do wykonania ===== |
==== Audyt kodu ==== | ==== Audyt kodu ==== |