c - tinyc 编译器 - libtcc,如何绑定(bind)检查?

标签 c compiler-construction

我正在使用 libtcc 即时编译 C 代码。我打算在云计算机上使用它,以便在互联网上使用。

我如何使用 tinyc 的内置内存和绑定(bind)检查器功能?

这是 tinyc libtcc 库附带的示例?

任何帮助都会很棒! 谢谢!

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

最佳答案

您可以使用以下方式手动设置边界检查:

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

只需确保 libtcc 编译时定义了 CONFIG_TCC_BCHECK

您可能还想使用以下方式启用调试:

s->do_debug = 1;

命令行选项 -b 的作用与启用边界检查完全相同(它也启用调试)。

关于c - tinyc 编译器 - libtcc,如何绑定(bind)检查?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9700022/

相关文章:

c++ - 为什么 int 在 64 位编译器上通常是 32 位的?

c++ - 如何查看编译器生成的代码

objective-c - 错误 : writable atomic property cannot pair a synthesized setter/getter with a user defined setter/getter

java - org/eclipse/jdt/internal/compiler 包的用途是什么?

cmake 和 make 构建重现性

c - 用于分布式内存集群的 OpenMP 或 MPI 或 OpenMPI?

c - 长选项作为 getopt_long 的静态变量

c - 销毁静态互斥体和 rwlock 初始值设定项

c++ - 包含 C 文件/与 CMake 的链接不适用于 C++ : cannot include function

assembly - 是什么使得 x = 2 与 MOV X , 2 机器无关?