2012-03-14 37 views
5

im sử dụng libtcc để biên dịch mã c khi đang di chuyển. Im sẽ sử dụng nó trên một máy tính đám mây, được sử dụng trên internet.trình biên dịch tinyc - libtcc, cách kiểm tra ràng buộc?

làm cách nào để tôi sử dụng bộ nhớ trong và chức năng kiểm tra giới hạn của tinyc?

heres một ví dụ đi kèm với thư viện tint libtcc?

mọi trợ giúp sẽ tuyệt vời! cảm ơn bạn!

/* 
* 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; 
} 

Trả lời

1

bạn có thể thiết lập giới hạn kiểm tra bằng tay sử dụng:

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

chỉ cần đảm bảo libtcc được biên soạn với CONFIG_TCC_BCHECK được xác định.

bạn cũng có thể muốn để cho phép gỡ lỗi sử dụng: dòng

s->do_debug = 1; 

lệnh tùy chọn -b hiện chính xác cùng để cho phép kiểm tra giới hạn (nó cho phép gỡ lỗi cũng).

+0

Ngoài việc không cho phép người dùng truy cập vào tệp và chức năng bộ nhớ (không bao gồm tệp của thư viện và tệp tiêu đề). Bất kỳ lời khuyên nào khác để bảo vệ quá trình của tôi bằng cách tạo càng nhiều càng tốt môi trường "Sandbox" cho tinyc? – user1268692

+0

Ngoài ra, có thư viện nào để kiểm tra mã c cho các lỗi như chia cho số không và các lỗi khác hay không. – user1268692

+0

@ user1268692: cho sandboxing, bạn cũng cần phải loại bỏ những thứ không an toàn như sử dụng lắp ráp nội tuyến và khả năng để có được mô-đun xử lý/procs. Đối với kiểm tra lỗi, tôi không biết bất kỳ thư viện rõ ràng nào, nhưng bạn có thể thử libclang – Necrolis

Các vấn đề liên quan