wrecc
ist ein kleiner, schlanker x86-64 C99-Compiler, der von Grund auf neu geschrieben wurde. Der Name ist ein Wortspiel mit dem Wort Wrack , das ein rostiges Schiff auf dem Meeresboden beschreibt. Der Compiler gibt x86-64-Assembly in AT&T-Syntax aus, er hält sich an die System V ABI, die ich nur für Ubuntu und MacOS testen konnte. Es gibt keine Abhängigkeiten, Sie benötigen lediglich Ihren Assembler und Linker, den der Compiler dann aufruft, um die endgültige Binärdatei zu erstellen.
Wenn Sie die Rust-Toolchain nicht auf Ihrem System installiert haben, können Sie die neueste Binärdatei (MacOs, Linux) aus den Versionen direkt installieren:
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/PhilippRados/wrecc/releases/download/v0.2.0/wrecc-installer.sh | sh
Verwenden von cargo binstall
cargo binstall wrecc
oder aus der Quelle bauen
cargo install wrecc
Da derzeit nicht alle Schlüsselwörter implementiert sind, verwendet wrecc benutzerdefinierte Standard-Header, die direkt in die Binärdatei integriert sind
Der Präprozessor implementiert alle C99-Präprozessordirektiven außer #line
, #error
und #pragma
. Am auffälligsten ist, dass derzeit auch funktionsähnliche Makros fehlen, die jedoch auf der Tagesordnung stehen.
struct {
union {
int foo ;
long baz ;
} nested ;
int array [ 16 ];
} bar = { . nested . foo = 3 , . array [ 6 ] = 1 };
#include
typedef int ( * BinaryOperation )( int , int );
typedef struct {
BinaryOperation add ;
BinaryOperation subtract ;
} Calculator ;
int add ( int a , int b ) { return a + b ; }
int subtract ( int a , int b ) { return a - b ; }
int main () {
Calculator calc = { add , subtract };
printf ( "Result of addition: %dn" , calc . add ( 10 , 5 ));
printf ( "Result of subtraction: %dn" , calc . subtract ( 10 , 5 ));
}
char * * string_offset = ( char * * ) & "hello" + ( int )( 3 * 1 );
int array [( long ) 3 * 2 - 1 ];
Abgesehen von den fehlenden Schlüsselwörtern sind dies die wichtigsten fehlenden Funktionen:
Hier ist eine Liste aller Dinge, die noch fehlen: todo
Wrecc hat auch gut aussehende Nachrichten. Die Fehlerberichterstattung endet nicht nach dem ersten Fehler. Mit der Option --no-color
können Sie die Farbhervorhebung bei Fehlern ausschalten. Derzeit gibt es nur Fehler und keine Warnungen.
C-Code | Fehler |
---|---|
int foo ( void );
int main () {
int a = foo ( 1 );
long * p = a ;
return p * 2 ;
} |
Beim Kompilieren mit der Option --dump-ast
wird der Analysebaum gedruckt
C-Code | AST |
---|---|
#define SIZE 16
void foo ( char );
int main () {
int arr [ SIZE ] = { 1 , 2 };
char p = ( char )( * arr + 3 );
switch ( p ) {
case 'c' :
foo ( p );
}
} | |
wrecc --help
ausführen cargo test --workspace
Dadurch werden alle Fixtures ausgeführt und mit dem erwarteten Snapshot verglichen
bash tests/snapshot_tests.sh
Führt den Fuzzer mit afl.rs aus
// in fuzzer directory
cargo afl build
cargo afl fuzz -i inputs -o outputs target/debug/fuzz_target
Gründe dafür, dass wrecc
auf Ihrem Computer nicht ordnungsgemäß funktioniert:
-L
behoben werden) Wenn Sie mir bei diesem Compiler helfen möchten, würde ich mich sehr darüber freuen. Der einfachste Ausgangspunkt ist wahrscheinlich die Implementierung eines der fehlenden Schlüsselwörter/Typen, die im Abschnitt „Nicht implementierte Funktionen“ erwähnt werden. Stellen Sie sicher, dass alle Tests trotzdem bestehen, und implementieren Sie Ihre eigenen, wenn es sich um etwas Neues handelt, das noch nicht getestet wird.
Schauen Sie sich die Dokumentation an, um einen allgemeinen Überblick über die Compiler-Pipeline zu erhalten.
Die folgenden Ressourcen haben mir beim Erstellen dieses Compilers geholfen: