From ebe9e87ccf7ef063fe907d92b833b1eac41bb099 Mon Sep 17 00:00:00 2001 From: bellard Date: Sat, 5 Jan 2002 19:50:17 +0000 Subject: [PATCH] update --- README | 36 ++++------ TODO | 18 ++--- tcc-doc.texi | 209 ++++++++++++++++++++++++++++++++++++++++++++++++++--------- 3 files changed, 199 insertions(+), 64 deletions(-) diff --git a/README b/README index 4043652d..d2d990f8 100644 --- a/README +++ b/README @@ -15,6 +15,9 @@ Features: heading torward full ISOC99 compliance. TCC can of course compile itself. +- SAFE! tcc includes an optional memory and bound checker. Bound + checked code can be mixed freely with standard code. + - Compile and execute C source directly. No linking or assembly necessary. Full C preprocessor included. @@ -27,7 +30,7 @@ Documentation: 1) Installation -***TCC currently only works on Linux x86***. +*** TCC currently only works on Linux x86 with glibc >= 2.1 ***. Type 'make install' to compile and install tcc in /usr/local/bin and /usr/local/lib/tcc. @@ -49,21 +52,7 @@ launch the C code as a shell or perl script :-) The command line arguments are put in 'argc' and 'argv' of the main functions, as in ANSI C. -3) Invokation - -'-Idir' : specify an additionnal include path. The -default ones are: /usr/include, /usr/lib/tcc, /usr/local/lib/tcc. - -'-Dsym' : define preprocessor symbol 'sym' to 1. - -'-lxxx' : dynamically link your program with library -libxxx.so. Standard library paths are checked, including those -specificed with LD_LIBRARY_PATH. - -'-i file' : compile C source 'file' before main C source. With this -command, multiple C files can be compiled and linked together. - -4) Examples +3) Examples ex1.c: simplest example (hello world). Can also be launched directly as a script: './ex1.c'. @@ -84,7 +73,7 @@ generator. prog.c: auto test for TCC which tests many subtle possible bugs. Used when doing 'make test'. -5) Full Documentation +4) Full Documentation Please read tcc-doc.html to have all the features of TCC. @@ -105,7 +94,7 @@ assembly), but it allows to be very fast and surprisingly not so complicated. The TCC code generator is register based. It means that it could even -generate good code for RISC processors. On x86, three temporary +generate not so bad code for RISC processors. On x86, three temporary registers are used. When more registers are needed, one register is flushed in a new local variable. @@ -113,13 +102,12 @@ Constant propagation is done for all operations. Multiplications and divisions are optimized to shifts when appropriate. Comparison operators are optimized by maintaining a special cache for the processor flags. &&, || and ! are optimized by maintaining a special -'jmp target' value. No other jmp optimization is currently performed +'jump target' value. No other jump optimization is currently performed because it would require to store the code in a more abstract fashion. -The types and values descriptions are stored in a single 'int' -variable (see VT_xxx constants). It was choosen in the first stages of -development when tcc was much simpler. Now, it may not be the best -solution. +The types are stored in a single 'int' variable (see VT_xxx +constants). It was choosen in the first stages of development when tcc +was much simpler. Now, it may not be the best solution. License: ------- @@ -130,4 +118,4 @@ file). I accept only patches where you give your copyright explicitely to me to simplify licensing issues. -Fabrice Bellard - Nov 17, 2001. +Fabrice Bellard. diff --git a/TODO b/TODO index b424e0a7..1fe16cba 100644 --- a/TODO +++ b/TODO @@ -1,25 +1,27 @@ TODO list: Critical: -- finish float/double support. add function type convertion. -- section generation and GNUC __attributte__ handling. -- D option with '=' handling -- 0 is pointer - fix type compare +- optimize slightly bound checking when doing addition + dereference. +- better section generator (suppress some mmaps). +- To check: bound checking and float/long long/struct copy code - To check: 'sizeof' may not work if too complex expression is given. -- fix 'char' and 'short' casts (only in function parameters and in - assignment). +- fix bound check code with '&' on local variables (currently done + only for local arrays). Not critical: -- interactive mode +- add PowerPC or ARM code generator and improve codegen for RISC (need + to suppress VT_LOCAL and use a base register instead). +- interactive mode / integrated debugger - fix multiple compound literals inits in blocks (ISOC99 normative example - only relevant when using gotos! -> must add boolean variable to tell if compound literal was already initialized). +- add more bounds checked functions (strcpy, ...) - fix L"\x1234" wide string case (need to store them as utf8 ?) - fix preprocessor symbol redefinition - better constant opt (&&, ||, ?:) - add ELF executable and shared library output option (would be needed for completness!). -- add PowerPC code generator. +- D option with all #define cases (needs C parser) - add portable byte code generator and interpreter for other unsupported architectures. diff --git a/tcc-doc.texi b/tcc-doc.texi index 4347fb17..ee1a9cf1 100644 --- a/tcc-doc.texi +++ b/tcc-doc.texi @@ -14,49 +14,51 @@ Tiny C Compiler Reference Documentation

Introduction

-TinyCC (aka TCC) is a small but very fast C compiler. Unlike other C +TinyCC (aka TCC) is a small but hyper fast C compiler. Unlike other C compilers, it is meant to be self-suffisant: you do not need an external assembler or linker because TCC does that for you.

- -TCC compiles so fast that even for big projects Makefiles may +TCC compiles so fast that even for big projects Makefiles may not be necessary.

+TCC not only supports ANSI C, but also most of the new ISO C99 +standard and many GNUC extensions. +

TCC can also be used to make C scripts, i.e. pieces of C source that you run as a Perl or Python script. Compilation is so fast that your script will be as fast as if it was an executable. +

+TCC can also automatically generate memory and bound +checks while allowing all C pointers operations. TCC can do these +checks even if non patched libraries are used. +

-

Exact differences with ANSI C

+

Full ANSI C support

-TCC implements almost all the ANSI C standard, except floating points -numbers. +TCC implements all the ANSI C standard, including structure bit fields +and floating point numbers (long double, double, and +float fully supported). The following limitations are known:

ISOC99 extensions

TCC implements many features of the new C standard: ISO C99. Currently -missing items are: complex and imaginary numbers (will come with ANSI -C floating point numbers), long longs and variable length +missing items are: complex and imaginary numbers and variable length arrays. Currently implemented ISOC99 features:

GNU C extensions

-TCC implements some GNU C extensions which are found in many C sources: +TCC implements some GNU C extensions:

TinyCC extensions

@@ -138,35 +178,140 @@ indicate that you use TCC.
  • Binary digits can be entered ('0b101' instead of '5'). +
  • __BOUNDS_CHECKING_ON is defined if bound checking is activated. + -

    Command line invokation

    +

    TinyCC Memory and Bound checks

    + + +This feature is activated with the '-b' +option. +

    +Note that pointer size is unchanged and that code generated +with bound checks is fully compatible with unchecked +code. When a pointer comes from unchecked code, it is assumed to be +valid. Even very obscure C code with casts should work correctly. +

    +

    To have more information about the ideas behind this method, check +here. +

    +

    +Here are some examples of catched errors: +

    + + + + + + + + + + + + + + + + +
    +
    +{
    +    char tab[10];
    +    memset(tab, 0, 11);
    +}
    +
    +
    Invalid range with standard string function
    +
    +{
    +    int tab[10];
    +    for(i=0;i<11;i++) {
    +        sum += tab[i];
    +    }
    +}
    +
    +
    Bound error in global or local arrays
    +
    +{
    +    int *tab;
    +    tab = malloc(20 * sizeof(int));
    +    for(i=0;i<21;i++) {
    +        sum += tab4[i];
    +    }
    +    free(tab);
    +}
    +
    +
    Bound error in allocated data
    +
    +{
    +    int *tab;
    +    tab = malloc(20 * sizeof(int));
    +    free(tab);
    +    for(i=0;i<20;i++) {
    +        sum += tab4[i];
    +    }
    +}
    +
    +
    Access to a freed region
    +
    +{
    +    int *tab;
    +    tab = malloc(20 * sizeof(int));
    +    free(tab);
    +    free(tab);
    +}
    +
    +
    Freeing an already freed region
    + +

    Command line invocation

    +
    -usage: tcc [-Idir] [-Dsym] [-llib] [-i infile] infile [infile_args...]
    +usage: tcc [-Idir] [-Dsym[=val]] [-Usym] [-llib] [-g] [-b]
    +           [-i infile] infile [infile_args...]
     
    - - - + + + - +specified with LD_LIBRARY_PATH. + + + + + -
    '-Idir'specify an additionnal include path. The default ones are: +Specify an additionnal include path. The default ones are: /usr/include, /usr/lib/tcc, /usr/local/lib/tcc.
    '-Dsym'define preprocessor symbol 'sym' to 1.
    '-Dsym[=val]' Define preprocessor symbol 'sym' to +val. If val is not present, its value is '1'. NOTE: currently, only +integer and strings are supported as values
    '-Usym' Undefine preprocessor symbol 'sym'.
    '-lxxx'dynamically link your program with library +Dynamically link your program with library libxxx.so. Standard library paths are checked, including those -specificed with LD_LIBRARY_PATH.
    '-g'Generate run time debug information so that you get clear run time +error messages: test.c:68: in function 'test5()': dereferencing +invalid pointer instead of the laconic Segmentation +fault. +
    '-b' Generate additionnal support code to check +memory allocations and array/pointer bounds. '-g' is implied. Note +that the generated code is slower and bigger in this case. +
    '-i file'compile C source 'file' before main C source. With this +Compile C source 'file' before main C source. With this command, multiple C files can be compiled and linked together.
    +
    +Note: the '-o file' option to generate an ELF executable is +currently unsupported.
    -Copyright (c) 2001 Fabrice Bellard
    -Fabrice Bellard - fabrice.bellard at free.fr - http://fabrice.bellard.free.fr/ - http://www.tinycc.org/ +Copyright (c) 2001, 2002 Fabrice Bellard
    +Fabrice Bellard - fabrice.bellard at free.fr - http://bellard.org/ - http://www.tinycc.org/ -- 2.11.4.GIT