2012-03-14 8 views
5

im przy użyciu libtcc do kompilacji kodu c w locie. Zamierzam użyć go na komputerze w chmurze, do wykorzystania przez Internet.tinyc kompilator - libtcc, jak sprawdzić granicę?

Jak używać tinyc zbudowany w pamięci i związanej funkcji sprawdzania?

heres przykład, który przychodzi z biblioteką tinyc libtcc?

każda pomoc będzie świetna! dziękuję!

/* 
* Simple Test program for libtcc 
* 
* libtcc can be useful to use tcc as a "backend" for a code generator. 
*/ 
#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 

#include "libtcc.h" 

/* this function is called by the generated code */ 
int add(int a, int b) 
{ 
    return a + b; 
} 

char my_program[] = 
"int fib(int n)\n" 
"{\n" 
" if (n <= 2)\n" 
"  return 1;\n" 
" else\n" 
"  return fib(n-1) + fib(n-2);\n" 
"}\n" 
"\n" 
"int foo(int n)\n" 
"{\n" 
" printf(\"Hello World!\\n\");\n" 
" printf(\"fib(%d) = %d\\n\", n, fib(n));\n" 
" printf(\"add(%d, %d) = %d\\n\", n, 2 * n, add(n, 2 * n));\n" 
" return 0;\n" 
"}\n"; 

int main(int argc, char **argv) 
{ 
    TCCState *s; 
    int (*func)(int); 
    void *mem; 
    int size; 

    s = tcc_new(); 
    if (!s) { 
     fprintf(stderr, "Could not create tcc state\n"); 
     exit(1); 
    } 

    /* if tcclib.h and libtcc1.a are not installed, where can we find them */ 
    if (argc == 2 && !memcmp(argv[1], "lib_path=",9)) 
     tcc_set_lib_path(s, argv[1]+9); 

    /* MUST BE CALLED before any compilation */ 
    tcc_set_output_type(s, TCC_OUTPUT_MEMORY); 

    if (tcc_compile_string(s, my_program) == -1) 
     return 1; 

    /* as a test, we add a symbol that the compiled program can use. 
     You may also open a dll with tcc_add_dll() and use symbols from that */ 
    tcc_add_symbol(s, "add", add); 

    /* get needed size of the code */ 
    size = tcc_relocate(s, NULL); 
    if (size == -1) 
     return 1; 

    /* allocate memory and copy the code into it */ 
    mem = malloc(size); 
    tcc_relocate(s, mem); 

    /* get entry symbol */ 
    func = tcc_get_symbol(s, "foo"); 
    if (!func) 
     return 1; 

    /* delete the state */ 
    tcc_delete(s); 

    /* run the code */ 
    func(32); 

    free(mem); 
    return 0; 
} 

Odpowiedz

1

można ustawić ręcznie za pomocą kontroli granic:

s->do_bounds_check = 1; //s here is TCCState* 

tylko upewnić libtcc jest skompilowany z CONFIG_TCC_BCHECK jest określony.

możesz również włączyć debugowanie przy użyciu: linia opcja

s->do_debug = 1; 

polecenie -b robi dokładnie to samo, aby umożliwić sprawdzenie granic (umożliwia debugowanie również).

+0

Oprócz nieudzielania użytkownikom dostępu do funkcji plików i pamięci (bez uwzględniania plików biblioteki i nagłówków). Jakieś inne porady dotyczące ochrony mojego procesu, tworząc jak najwięcej środowiska "sandbox" dla tinyc? – user1268692

+0

Czy istnieją również biblioteki do sprawdzania kodu c dla błędów takich jak dzielenie przez zero i inne. – user1268692

+0

@ user1268692: w przypadku piaskownicy należy również usunąć niebezpieczne rzeczy, takie jak użycie wbudowanego zestawu oraz możliwość uzyskania uchwytów modułów/proc. Jeśli chodzi o sprawdzanie błędów, nie znam żadnych jawnych bibliotek, ale możesz wypróbować libclang – Necrolis

Powiązane problemy