[Firm] Probleme mit cparser

Moritz Kroll Moritz.Kroll at avira.com
Sat Jan 31 01:33:38 CET 2015


Hallo zusammen,

ich probiere nach einiger Zeit mal wieder cparser in einer aktuellen
Version zu kompilieren, um aus Windows-Headers automatisch Informationen
über API-Funktionen zu extrahieren (Namen, Parameternamen und -typen,
Rückgabetyp, calling convention). Die Informationen verwende ich bei der
Stack-Analyse von Funktionen in einem Disassembler. Ich verwende dazu
ein eigenes "wrappergen"-Modul auf Basis von write_jna.

Zuerst einmal bekomme ich bei eurer Anleitung
(http://pp.ipd.kit.edu/firm/Download) diese Fehler:

-------
$ git clone http://pp.ipd.kit.edu/git/cparser.git
Cloning into 'cparser'...
remote: Counting objects: 14860, done.
remote: Compressing objects: 100% (4436/4436), done.
remote: Total 14860 (delta 10738), reused 14343 (delta 10343)
Receiving objects: 100% (14860/14860), 2.83 MiB, done.
Resolving deltas: 100% (10738/10738), done.

$ cd cparser
$ git submodule update --init
Submodule 'libfirm' (http://pp.info.uni-karlsruhe.de/git/libfirm.git/)
registere
d for path 'libfirm'
Cloning into 'libfirm'...
fatal: The remote end hung up unexpectedly
fatal: protocol error: bad pack header
Clone of 'http://pp.info.uni-karlsruhe.de/git/libfirm.git/' into
submodule path
'libfirm' failed
-------

Nachdem ich eine Weile daran verzweifelt war, hatte ich dann das Github
Repository genommen.

Dabei bin ich bei Git-Referenz c89dd8e auf ein paar Probleme gestoßen:

1. Die Option "--ms" hat keine Auswirkungen, da init_tokens aufgerufen
wird, bevor das entsprechende "dialect" Flag in init_c_dialect gesetzt wird.

2. Bei der Deklaration von Funktionszeigertypen werden im MS-Modus keine
calling convention modifier erlaubt (siehe
https://msdn.microsoft.com/en-us/library/zxk0tw93.aspx und angehängter
Testkäse (Hi Christoph ^_^) stdcall-func-typedef.c). Ich hab dazu einen
Patch angehängt.

3. Im C++-Modus wird bei

typedef long NTSTATUS;
typedef NTSTATUS *PNTSTATUS;
typedef long *PNTSTATUS;

die zweite Definition von "PNTSTATUS" als unerlaubte Redefinition
aufgefasst (siehe multi-typedef.cpp). An der entsprechenden Stelle in
record_entity sollten aber eigentlich bereits alle typedefs übersprungen
werden. Scheint ihm aber trotzdem nicht gleich genug zu sein. Vielleicht
wegen den Zeigern?

Wäre schön, wenn ihr meinen Patch einbauen könntet und ein paar aktive
Blicke auf die beiden anderen Probleme werfen könntet ;)

Schöne Grüße
Moritz

--
Moritz Kroll
Software Developer & Researcher
Advanced Threat Research And Protection Systems
Email: moritz.kroll at avira.com

--
Avira Operations GmbH & Co. KG
Kaplaneiweg 1 | 88069 Tettnang | Deutschland / Germany
Telefon / Telephone: +49 7542-500 0
Telefax / Facsimile: +49 7542-500 3000

Registergericht: Amtsgericht Ulm, HRA 722586 | USt.-IdNr.: DE 815289569 | Pers. haftende Gesellschafterin: Avira OP GmbH | Firmensitz: Tettnang | Registergericht: Amtsgericht Ulm, HRB 726712 | Geschäftsführer: Travis Witteveen

Commercial Register: Amtsgericht Ulm, HRA 722586 | VAT-ID: DE 815289569 | Personally Liable Partner: Avira OP GmbH | Headquarters: Tettnang | Commercial Register: Amtsgericht Ulm, HRB 726712 | Chief Executive Officer (CEO): Travis Witteveen
-------------- next part --------------
From 422c5c1c0cd0f261eeab69b5c4d4a360ef4e5a3c Mon Sep 17 00:00:00 2001
From: Moritz Kroll <moritz.kroll at avira.com>
Date: Sat, 31 Jan 2015 01:16:20 +0100
Subject: [PATCH] Allow MS calling convention modifiers for function
 declarators

---
 src/parser/parser.c | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/src/parser/parser.c b/src/parser/parser.c
index ed8e6f2..5bd6fc3 100644
--- a/src/parser/parser.c
+++ b/src/parser/parser.c
@@ -3345,6 +3345,10 @@ ptr_operator_end: ;
 		case '(':
 		case '*':
 		case '[':
+		case T_cdecl:
+		case T__fastcall:
+		case T__stdcall:
+		case T___thiscall:
 		case T___attribute__: /* FIXME __attribute__ might also introduce a parameter of a function declarator. */
 				/* Paranthesized declarator. */
 				eat('(');
-- 
1.8.0.msysgit.0
-------------- next part --------------
// Example based on https://msdn.microsoft.com/en-us/library/zxk0tw93.aspx

typedef int (__stdcall *funcname_ptr)(void *arg1, const char *arg2, long flags);
-------------- next part --------------
typedef long NTSTATUS;
typedef NTSTATUS *PNTSTATUS;
typedef long *PNTSTATUS;


More information about the Firm mailing list