diff --git a/README b/README index 4043652..d2d990f 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 b424e0a..1fe16cb 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 4347fb1..ee1a9cf 100644 --- a/tcc-doc.texi +++ b/tcc-doc.texi @@ -14,49 +14,51 @@ Tiny C Compiler Reference Documentation
- -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. +
-double d = 0x1234p10; @@ -98,11 +95,15 @@ is the same as writingdouble d = 4771840.0;+ +
+ switch(a) { + case 1 ... 9: + printf("range 1 to 9\n"); + break; + default: + printf("unexpected\n"); + break; + } ++ +
+ int a __attribute__ ((aligned(8), section(".mysection"))); ++
+ int my_add(int a, int b) __attribute__ ((section(".mycodesection"))) + { + return a + b; + } ++
+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 | + +
-usage: tcc [-Idir] [-Dsym] [-llib] [-i infile] infile [infile_args...] +usage: tcc [-Idir] [-Dsym[=val]] [-Usym] [-llib] [-g] [-b] + [-i infile] infile [infile_args...]
'-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. | +specified 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. |