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)
  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