Aktualne zabezpieczenia testerki - 13MaxG/TikTok GitHub Wiki
Ogólna metoda testowania
Użytkownik wysyła kawałek kodu Mathematici. Jest on testowany przez kilka testów na problem. Do kodu użytkownika dokleja się kod testu. Powstały kod przesyła się do tekstowej mathematici (wolfram.exe) i odczytuje wynik. Wynik jest filtrowany. Odnalezienie ACC:YES zalicza test. Odnalezienie ACC:_NO odrzuca test. Odnalezienie (COMMENT:*:COMMENT) wysyła komentarz użytkownikowi.
Prawdziwość ACC i COMMENT
Kod użytkownika od testu oddzielany jest Print["BEGIN_TEST"]. Znajdywane jest ostatnie takie wystąpienie, i filtrowany jest tylko fragment wyjścia od tego miejsca do końca.
Ingerencja w środowisko
Kod wykonywany jest w sandboksie dzięki Developer```StartProtectedMode[].
Blokowane słowa
- ClearAttributes (1)
- SetAttributes (1)
- Aby zablokować możliwość nadpisywania predefiniowanych funkcji.
ClearAttributes[{Sort}, Protected];
Sort[___] := $Failed;
SetAttributes[{Sort}, Protected];
Sort[x]
Przedwczesne zakończenie
Przed wykonaniem każdego testu, dopisywane jest do niego na koniec hasło, które jest pseudolosowe dla każdego wykonania. Jeżeli testerka nie odczyta hasła, uzna ingerencje w przebieg testowania i uzna test za niezaliczony.
Taka sytuacja może się zdarzyć jeżeli użytkownik użyje polecenia Exit[]
Zabezpieczanie funkcji i zmiennych testujących
Testy nie są jawne dla użytkowników, ale gdyby znali nazwy funkcji testujących mogli by je podmienić. Dopisując TIK do nazwy funkcji testerka nada jej losową nazwę podczas wykonywania.
W szczególności trzeba tego używać jeżeli piszemy pętle iterująca no po i, a użytkownik napiszę funkcję która też ma zmienną i, której nie zaznaczy w Module. Powinno być iTIK.
Przykład, mamy funkcje testującą
Test[x_] := If[Mod[f[x], 2] == 0, Print["ACC:YES"], Print["ACC:_NO"]]
Użytkownik tworzy funkcję f
f[x_] := Test[y_] := Print["LOL"]; (* złośliwie *)
A wynikiem zapytań Test[1] Test[2]
jest
If[Mod[Null, 2] == 0, Print["ACC:YES"], Print["ACC:_NO"]]
LOL
Kolejka testowania
Testerka jest uruchamiana po wysłaniu każdego submita. Każdy submit ma pole is_executed. Testerka wysyła zapytanie o listę takich submitów i będzie je po kolei wykonywać. Po wykonaniu, testerka uruchomi się rekurencyjnie. Jeżeli nie będzie submitów to zakończy pracę.
Ponadto jest globalna zmienna mówiąca czy testerka pracuje