From 2e3736494f71be60ebce7f363cc26bc59aaf38d3 Mon Sep 17 00:00:00 2001 From: CUB3D Date: Thu, 5 Mar 2026 14:32:56 +0000 Subject: [PATCH 1/4] Support the microsoft-specific {i,I}64 integer suffix in CParser --- .../Base/src/main/javacc/ghidra/app/util/cparser/C/C.jj | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Ghidra/Features/Base/src/main/javacc/ghidra/app/util/cparser/C/C.jj b/Ghidra/Features/Base/src/main/javacc/ghidra/app/util/cparser/C/C.jj index 49d6bd44d4..d990cff022 100644 --- a/Ghidra/Features/Base/src/main/javacc/ghidra/app/util/cparser/C/C.jj +++ b/Ghidra/Features/Base/src/main/javacc/ghidra/app/util/cparser/C/C.jj @@ -1079,11 +1079,11 @@ SKIP : TOKEN : { ( "ull" | "ULL" | "ul" | "UL" | "ll" | "LL" | "l" | "L" | "U" | "u")? ("i")? ( ["0"-"9"] )* + ( "ull" | "ULL" | "ul" | "UL" | "ll" | "LL" | "l" | "L" | "U" | "u" | "i64" | "I64")? ("i")? ( ["0"-"9"] )* | - ( "ull" | "ULL" | "ul" | "UL" | "ll" | "LL" | "l" | "L" | "U" | "u")? ("i")? ( ["0"-"9"] )* + ( "ull" | "ULL" | "ul" | "UL" | "ll" | "LL" | "l" | "L" | "U" | "u" | "i64" | "I64")? ("i")? ( ["0"-"9"] )* | - ( "ull" | "ULL" | "ul" | "UL" | "ll" | "LL" | "l" | "L" | "U" | "u")? ("i")? ( ["0"-"9"] )* + ( "ull" | "ULL" | "ul" | "UL" | "ll" | "LL" | "l" | "L" | "U" | "u" | "i64" | "I64")? ("i")? ( ["0"-"9"] )* > | <#DECIMAL_LITERAL : [ "1"-"9" ] ( [ "0"-"9" ] )*> From cf4fe9994cba2ad14650b88041f4512be7cf4b3f Mon Sep 17 00:00:00 2001 From: CUB3D Date: Wed, 11 Mar 2026 15:16:42 +0000 Subject: [PATCH 2/4] Changes from review --- .../javacc/ghidra/app/util/cparser/C/C.jj | 35 +++++++++++-------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/Ghidra/Features/Base/src/main/javacc/ghidra/app/util/cparser/C/C.jj b/Ghidra/Features/Base/src/main/javacc/ghidra/app/util/cparser/C/C.jj index d990cff022..2f77357ae0 100644 --- a/Ghidra/Features/Base/src/main/javacc/ghidra/app/util/cparser/C/C.jj +++ b/Ghidra/Features/Base/src/main/javacc/ghidra/app/util/cparser/C/C.jj @@ -1079,11 +1079,11 @@ SKIP : TOKEN : { ( "ull" | "ULL" | "ul" | "UL" | "ll" | "LL" | "l" | "L" | "U" | "u" | "i64" | "I64")? ("i")? ( ["0"-"9"] )* + ("u"|"U")? ("ll"|"LL"|"l"|"L")? (("i"|"I") ("8"|"16"|"32"|"64"|"128"))? | - ( "ull" | "ULL" | "ul" | "UL" | "ll" | "LL" | "l" | "L" | "U" | "u" | "i64" | "I64")? ("i")? ( ["0"-"9"] )* + ("u"|"U")? ("ll"|"LL"|"l"|"L")? (("i"|"I") ("8"|"16"|"32"|"64"|"128"))? | - ( "ull" | "ULL" | "ul" | "UL" | "ll" | "LL" | "l" | "L" | "U" | "u" | "i64" | "I64")? ("i")? ( ["0"-"9"] )* + ("u"|"U")? ("ll"|"LL"|"l"|"L")? (("i"|"I") ("8"|"16"|"32"|"64"|"128"))? > | <#DECIMAL_LITERAL : [ "1"-"9" ] ( [ "0"-"9" ] )*> @@ -3079,39 +3079,46 @@ Object Constant() : { ( t = { - String sval = t.image; - if (sval.endsWith("i8") || sval.endsWith("I8")) { + String sval = t.image.toLowerCase(); + if (sval.endsWith("i8")) { sval = sval.substring(0,sval.length()-2); } - else if (sval.endsWith("i16") || sval.endsWith("I16")) { + else if (sval.endsWith("i16")) { sval = sval.substring(0,sval.length()-3); } - else if (sval.endsWith("i32") || sval.endsWith("I32")) { + else if (sval.endsWith("i32")) { sval = sval.substring(0,sval.length()-3); } - else if (sval.endsWith("i64") || sval.endsWith("I64")) { + else if (sval.endsWith("i64")) { sval = sval.substring(0,sval.length()-3); } + else if (sval.endsWith("i128")) { + sval = sval.substring(0,sval.length()-4); + } - if (sval.endsWith("ull") || sval.endsWith("ULL")) { + if (sval.endsWith("ull")) { sval = sval.substring(0,sval.length()-3); } - else if (sval.endsWith("ll") || sval.endsWith("LL")) { + else if (sval.endsWith("ll")) { sval = sval.substring(0,sval.length()-2); } - else if (sval.endsWith("ul") || sval.endsWith("UL")) { + else if (sval.endsWith("ul")) { sval = sval.substring(0,sval.length()-2); } - else if (sval.endsWith("l") || sval.endsWith("L")) { + else if (sval.endsWith("l")) { sval = sval.substring(0,sval.length()-1); } - else if (sval.endsWith("u") || sval.endsWith("U")) { + else if (sval.endsWith("u")) { sval = sval.substring(0,sval.length()-1); } - if (sval.startsWith("0x") || sval.startsWith("0X")) { + if (sval.startsWith("0x")) { BigInteger bigConst = new BigInteger(sval.substring(2), 16); obj = Long.valueOf(bigConst.longValue()); } + else if (sval.startsWith("0") && sval.length() > 1) { + BigInteger bigConst = new BigInteger(sval.substring(1), 8); + obj = Long.valueOf(bigConst.longValue()); + } else { BigInteger bigConst = new BigInteger(sval); obj = Long.valueOf(bigConst.longValue()); From f7f890c71f412886033003c3362b1ac1b2377740 Mon Sep 17 00:00:00 2001 From: emteere <47253321+emteere@users.noreply.github.com> Date: Wed, 11 Mar 2026 18:34:37 +0000 Subject: [PATCH 3/4] GP-6553 Adding tests for i64 and other constant variants --- .../javacc/ghidra/app/util/cparser/C/C.jj | 4 +-- .../ghidra/app/util/cparser/CParserTest.h | 31 ++++++++++++++++++- 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/Ghidra/Features/Base/src/main/javacc/ghidra/app/util/cparser/C/C.jj b/Ghidra/Features/Base/src/main/javacc/ghidra/app/util/cparser/C/C.jj index 2f77357ae0..f295183396 100644 --- a/Ghidra/Features/Base/src/main/javacc/ghidra/app/util/cparser/C/C.jj +++ b/Ghidra/Features/Base/src/main/javacc/ghidra/app/util/cparser/C/C.jj @@ -3115,8 +3115,8 @@ Object Constant() : { BigInteger bigConst = new BigInteger(sval.substring(2), 16); obj = Long.valueOf(bigConst.longValue()); } - else if (sval.startsWith("0") && sval.length() > 1) { - BigInteger bigConst = new BigInteger(sval.substring(1), 8); + else if (sval.startsWith("0")) { + BigInteger bigConst = new BigInteger(sval, 8); obj = Long.valueOf(bigConst.longValue()); } else { diff --git a/Ghidra/Features/Base/src/test/resources/ghidra/app/util/cparser/CParserTest.h b/Ghidra/Features/Base/src/test/resources/ghidra/app/util/cparser/CParserTest.h index 0b536ee0e7..c854e30737 100644 --- a/Ghidra/Features/Base/src/test/resources/ghidra/app/util/cparser/CParserTest.h +++ b/Ghidra/Features/Base/src/test/resources/ghidra/app/util/cparser/CParserTest.h @@ -1189,8 +1189,37 @@ void multilineStrings(void) char b[] = "This is a " "multiline string."; } - +/** + ** Constants + **/ + /* Decimal */ + int dec_int = 28; + unsigned dec_uint = 4000000024u; + long dec_long = 2000000022l; + unsigned long dec_ulong = 4000000000ul; + long long dec_llong = 9000000000LL; + unsigned long long dec_ullong = 900000000001ull; + __int64 dec_i64 = 9000000000002I64; + unsigned __int64 dec_ui64 = 90000000000004ui64; + /* Octal */ + int oct_int = 024; + unsigned oct_uint = 04000000024u; + long oct_long = 02000000022l; + unsigned long oct_ulong = 04000000000UL; + long long oct_llong = 044000000000000ll; + unsigned long long oct_ullong = 044400000000000001Ull; + __int64 oct_i64 = 04444000000000000002i64; + unsigned __int64 oct_ui64 = 04444000000000000004uI64; + /* Hexadecimal */ + int hex_int = 0x2a; + unsigned hex_uint = 0XA0000024u; + long hex_long = 0x20000022l; + unsigned long hex_ulong = 0XA0000021uL; + long long hex_llong = 0x8a000000000000ll; + unsigned long long hex_ullong = 0x8A40000000000010uLL; + __int64 hex_i64 = 0x4a44000000000020I64; + unsigned __int64 hex_ui64 = 0x8a44000000000040Ui64; /** ** #line in structure/function body From 98202ea19a836eda92df17b645ca3c77cb36a608 Mon Sep 17 00:00:00 2001 From: emteere <47253321+emteere@users.noreply.github.com> Date: Wed, 11 Mar 2026 19:03:36 +0000 Subject: [PATCH 4/4] GP-6553 minor test changes --- .../ghidra/app/util/cparser/CParserTest.h | 48 +++++++++---------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/Ghidra/Features/Base/src/test/resources/ghidra/app/util/cparser/CParserTest.h b/Ghidra/Features/Base/src/test/resources/ghidra/app/util/cparser/CParserTest.h index c854e30737..114d618b98 100644 --- a/Ghidra/Features/Base/src/test/resources/ghidra/app/util/cparser/CParserTest.h +++ b/Ghidra/Features/Base/src/test/resources/ghidra/app/util/cparser/CParserTest.h @@ -1194,32 +1194,32 @@ void multilineStrings(void) ** Constants **/ /* Decimal */ - int dec_int = 28; - unsigned dec_uint = 4000000024u; - long dec_long = 2000000022l; - unsigned long dec_ulong = 4000000000ul; - long long dec_llong = 9000000000LL; - unsigned long long dec_ullong = 900000000001ull; - __int64 dec_i64 = 9000000000002I64; - unsigned __int64 dec_ui64 = 90000000000004ui64; + int d_int = 123; + unsigned d_uint = 4000000123u; + long d_long = 1000000123l; + unsigned long d_ulong = 7000000001ul; + long long d_llong = 6000000002LL; + unsigned long long d_ullong = 50000000003ull; + __int64 d_i64 = 500000000004I64; + unsigned __int64 d_ui64 = 5000000000005ui64; /* Octal */ - int oct_int = 024; - unsigned oct_uint = 04000000024u; - long oct_long = 02000000022l; - unsigned long oct_ulong = 04000000000UL; - long long oct_llong = 044000000000000ll; - unsigned long long oct_ullong = 044400000000000001Ull; - __int64 oct_i64 = 04444000000000000002i64; - unsigned __int64 oct_ui64 = 04444000000000000004uI64; + int o_int = 01234; + unsigned o_uint = 04000000012u; + long o_long = 02000000024l; + unsigned long o_ulong = 01000000001UL; + long long o_llong = 01100000000002ll; + unsigned long long o_ullong = 01110000000000003Ull; + __int64 o_i64 = 0111100000000000004i64; + unsigned __int64 o_ui64 = 0222200000000000005uI64; /* Hexadecimal */ - int hex_int = 0x2a; - unsigned hex_uint = 0XA0000024u; - long hex_long = 0x20000022l; - unsigned long hex_ulong = 0XA0000021uL; - long long hex_llong = 0x8a000000000000ll; - unsigned long long hex_ullong = 0x8A40000000000010uLL; - __int64 hex_i64 = 0x4a44000000000020I64; - unsigned __int64 hex_ui64 = 0x8a44000000000040Ui64; + int h_int = 0x123b; + unsigned h_uint = 0XB0000012u; + long h_long = 0x20000034l; + unsigned long h_ulong = 0XA0000056uL; + long long h_llong = 0x8b00000000000ll; + unsigned long long h_ullong = 0xAC4000000000012uLL; + __int64 h_i64 = 0x6d2200000000023I64; + unsigned __int64 h_ui64 = 0x7e4400000000034Ui64; /** ** #line in structure/function body