tinyc compiler - libtcc, how to bound check?
Asked Answered
P

1

6

im using libtcc to compile c code on the fly. Im going to use it on a cloud computer, to be used over the internet.

how do i use tinyc's built in memory and bound checker function?

heres an example that comes with the tinyc libtcc library?

any help would be great! thank you!

/*
 * 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;
}
Planarian answered 14/3, 2012 at 10:23 Comment(0)
F
3

you can set bounds checking manually using:

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

just make sure libtcc is compiled with CONFIG_TCC_BCHECK being defined.

you may also want to enable debugging using:

s->do_debug = 1;

the command line option -b does the exact same to enable bounds checking (it enables debugging as well).

Fovea answered 14/3, 2012 at 11:1 Comment(3)
Apart from not letting users access to file and memory function(by not including the library's and header files). Any other advice to protect my process by creating as much as possible a "Sandbox" environment for tinyc?Planarian
Also, is there any library's for checking c code for errors like dividing by zero and others.Planarian
@user1268692: for sandboxing, you also need to remove unsafe things like inline assembly usage and the ability to get module handles/procs. As for error check, I don't know any explicit libraries, but you can try libclangFovea

© 2022 - 2024 — McMap. All rights reserved.