System do uruchamiania zadań algorytmicznych

0

Posiadam napisany i działający system do sprawdzania zadań algorytmicznych
Jest to odpowiednik portalów spoj lub codeforces, gdzie użytkownik może wkleić kod zadania w kilku dostępnych językach (zazwyczaj C i C++) i rozwiązać zadanie.

System, który mam jest oparty o bibliotekę rjudge
https://sourceforge.net/projects/rjudge/
Uruchamia ona wysłany kod i weryfikuje poprawność.

Główny problem takiego systemu to brak możliwości tworzenia nowych procesów, tworzenia nowych plików, wywoływania komend systemowych itd.
Czy jest w C/C++ gotowa biblioteka lub inne narzędzie, które może wykorzystać w takim systemie?
Biblioteka jest bardzo przestarzała (2009 rok) i system wymaga napisania od nowa z nowymi funkcjonalnościami

0

Właśnie się zbieram do napisania czegoś takiego. Wcześniej zrobiłem już coś podobnego na potrzeby swoich prezentacji (posklejane na kolanie) - odpala programy na dockerze.
Zamierzam to teraz zrobić na czysto na kubernetesie - żeby chodziło na GKE.

Co do czasu wykonania - akurat mnie ten temat nie interesuje, ale będzie trudno.
W zasadzie mierzenie czasu na typowym OS jest lekko do bani. Zawsze będzie element losowy, jak jakies zespoły będą się ścigać na mikrosekundy może wyjść słabo.
Lepiej by mierzyć cykle. Performance counters - (na linuxie perf) takie rzeczy zbierają.
Tylko, że to są rzeczy które raczej na dockerze/kontenerach nie działają (ale po prawdzie nie wiem - nigdy nie widziałem, nigdy nie testowałem).
Idealnie to by chyba odpalać na maszynie wirtualnej (niekoniecznie java :-) ) i zliczać kroki. Ciekawe czy w llvm/lli jest coś takiego. To by było najbardziej fair, bo jak testowanie jest robione na konkretnych CPU i architekturze, to zawsze będzie to faworyzować posiadaczy dokładnie takiego sprzętu (intel vs AMD vs ARM - różne generacje.

0

Tak już trochę z innej beczki - nie można by tego zrobić po staremu, tj.

  1. Mamy jakieś agent poole, np. 5 maszyn odpalających C, 5 maszyn odpalających kod Javy itp.
  2. W momencie submitu kod z rozwiązaniem jest wklejany do skryptu z testami
  3. Tak przygotowany kod leci do agenta, na którym jest kompilowany i odpalany
  4. Z powrotem dostajemy wyniki tego wszystkiego

I wtedy można sobie zliczać co się chce z OSu, przy czym pewnie zależy to mocno od języka.

0

Taki Godbolt ztcp lata w dockerze o odpowiednich uprawnieniach po prostu, zobacz

oraz https://github.com/compiler-explorer/compiler-explorer

3
  1. https://github.com/google/kctf
  2. Ogólnie popatrzyłbym jak się robi hardening pod zadania z eksploitacji na CTFach ;) Jakieś nsjail, kontenery itd
  3. Dobry talk by @Demonical Monk(część "usługi wysokiego ryzyka")

edit: taka też post-CTFowa ciekawostka. Sama kompilacja pozwala potencjalnie wyciągnać informacje z systemu, nawet jeśli tego kodu nie uruchamiamy wcale! Z pewnego ctfa:

Wiemy że plik flag.txt zawiera string hxp{cośatm co chcemy wyciągnąć}.
Możemy wrzucić kod do skompilowania i wiemy tylko czy się skompilował czy nie. Rozwiązanie:

int main(void) {
    #define as_string( s ) # s
    #define hxp as_string(
    
    static const int x = 1/((int)
    #include "flag.txt"
    )[0]-1);
    return x;
}

Na podstawie wartości z pliku mamy błąd kompilacji division by zero albo nie i na tej podstawie możemy znak po znaku wyciągnąć zawartość pliku... ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1