Skip to content

Commit 3ac5d72

Browse files
committed
Merge remote-tracking branch
'origin/GP-1295_emteere_CParser_MacroExpansionTruthFix--SQUASHED' into patch (Closes #3410, Closes #1652, Closes #2665, Closes #2666))
2 parents b1885e5 + c7ba2e3 commit 3ac5d72

File tree

4 files changed

+404
-159
lines changed

4 files changed

+404
-159
lines changed

Ghidra/Features/Base/src/main/javacc/ghidra/app/util/cparser/C/C.jj

Lines changed: 150 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -520,6 +520,73 @@ public class CParser {
520520
}
521521
}
522522

523+
Object computeBinaryValue(Object obj1, Token operation, Object obj2) {
524+
if (!(obj1 instanceof Long && obj2 instanceof Long)) {
525+
return null;
526+
}
527+
Long val1 = (Long) obj1;
528+
Long val2 = (Long) obj2;
529+
530+
switch(operation.image) {
531+
case "<<":
532+
return val1 << val2;
533+
case ">>":
534+
return val1 >> val2;
535+
case "+":
536+
return val1 + val2;
537+
case "-":
538+
return val1 - val2;
539+
case "*":
540+
return val1 * val2;
541+
case "/":
542+
return val1 / val2;
543+
case "%":
544+
return val1 % val2;
545+
case "|":
546+
return val1 | val2;
547+
case "&":
548+
return val1 & val2;
549+
case "^":
550+
return val1 ^ val2;
551+
case "==":
552+
return (val1 == val2 ? 1 : 0);
553+
case "!=":
554+
return (val1 != val2 ? 1 : 0);
555+
case "<":
556+
return (val1 < val2 ? 1 : 0);
557+
case ">":
558+
return (val1 > val2 ? 1 : 0);
559+
case "<=":
560+
return (val1 <= val2 ? 1 : 0);
561+
case ">=":
562+
return (val1 >= val2 ? 1 : 0);
563+
case "&&":
564+
return ((val1 != 0 && val2 != 0) ? 1 : 0);
565+
case "||":
566+
return ((val1 != 0 || val2 != 0) ? 1 : 0);
567+
}
568+
return null;
569+
}
570+
571+
Object computeUnaryValue(Object obj, Token operation) {
572+
if (!(obj instanceof Long)) {
573+
return null;
574+
}
575+
Long val = (Long) obj;
576+
577+
switch(operation.image) {
578+
case "+":
579+
return val;
580+
case "-":
581+
return -val;
582+
case "~":
583+
return ~val;
584+
case "!":
585+
return (val != 0 ? 0 : 1);
586+
}
587+
return null;
588+
}
589+
523590
/**
524591
* Get the data type manager
525592
*
@@ -1517,7 +1584,7 @@ void DeclSpecifier() : {
15171584
{
15181585
"(" DeclSpecifier() ")" |
15191586
<IDENTIFIER> [ "("
1520-
DeclConstant()
1587+
DeclConstant() ( DeclConstant() )*
15211588
")" ]
15221589
}
15231590

@@ -1743,6 +1810,7 @@ void StructDeclaration(Composite comp, CompositeHandler compositeHandler) : {
17431810
Declaration dt = null;
17441811
}
17451812
{
1813+
LineDef() |
17461814
(
17471815
[ dt = SpecifierQualifierList() ]
17481816
[
@@ -2165,16 +2233,28 @@ void IdentifierList(FunctionDefinitionDataType funcDT, DataType retDT) : {
21652233

21662234
void Initializer() : {}
21672235
{
2168-
( AssignmentExpression() | "{" InitializerList() [ "," ] "}" )
2236+
( AssignmentExpression() | "{" InitializerList() [ "," ] "}" )
21692237
}
21702238

21712239
void InitializerList() : {}
21722240
{
2173-
Initializer()
2174-
(
2175-
LOOKAHEAD(2)
2176-
"," Initializer()
2177-
)*
2241+
[ Designation() ] Initializer() [ "," InitializerList() ]
2242+
}
2243+
2244+
void Designation() : { }
2245+
{
2246+
DesignatorList() "="
2247+
}
2248+
2249+
void DesignatorList() : { }
2250+
{
2251+
Designator() [ DesignatorList() ]
2252+
}
2253+
2254+
void Designator() : { }
2255+
{
2256+
"[" ConstantExpression() "]" |
2257+
"." <IDENTIFIER>
21782258
}
21792259

21802260
DataType TypeName() : {
@@ -2415,120 +2495,117 @@ Object ConstantExpression() : {
24152495
}
24162496

24172497
Object LogicalORExpression() : {
2418-
Object obj = null;
2498+
Object obj = null, obj2 = null; Token op=null;
24192499
}
24202500
{
2421-
obj = LogicalANDExpression() [ "||" LogicalORExpression() { obj=null; } ]
2501+
obj = LogicalANDExpression() ( op="||" obj2 = LogicalANDExpression() { obj = computeBinaryValue(obj, op, obj2); } ) *
24222502
{
24232503
return obj;
24242504
}
24252505
}
24262506

24272507
Object LogicalANDExpression() : {
2428-
Object obj = null;
2508+
Object obj = null, obj2 = null; Token op=null;
24292509
}
24302510
{
2431-
obj = InclusiveORExpression() [ "&&" LogicalANDExpression() { obj=null; } ]
2511+
obj = InclusiveORExpression() ( op="&&" obj2=InclusiveORExpression() { obj = computeBinaryValue(obj, op, obj2); } ) *
24322512
{
24332513
return obj;
24342514
}
24352515
}
24362516

24372517
Object InclusiveORExpression() : {
2438-
Object obj = null;
2518+
Object obj = null, obj2 = null; Token op=null;
24392519
}
24402520
{
2441-
obj = ExclusiveORExpression() [ "|" InclusiveORExpression() { obj=null; } ]
2521+
obj = ExclusiveORExpression() ( op="|" obj2=ExclusiveORExpression() { obj = computeBinaryValue(obj, op, obj2); } ) *
24422522
{
24432523
return obj;
24442524
}
24452525
}
24462526

24472527
Object ExclusiveORExpression() : {
2448-
Object obj = null;
2528+
Object obj = null, obj2 = null; Token op=null;
24492529
}
24502530
{
2451-
obj = ANDExpression() [ "^" ExclusiveORExpression() { obj=null; } ]
2531+
obj = ANDExpression() ( op="^" obj2=ANDExpression() { obj = computeBinaryValue(obj, op, obj2); } ) *
24522532
{
24532533
return obj;
24542534
}
24552535
}
24562536

24572537
Object ANDExpression() : {
2458-
Object obj = null;
2538+
Object obj = null, obj2 = null; Token op=null;
24592539
}
24602540
{
2461-
obj = EqualityExpression() [ "&" ANDExpression() { obj=null; } ]
2541+
obj = EqualityExpression() ( op="&" obj2=EqualityExpression() { obj = computeBinaryValue(obj, op, obj2); } ) *
24622542
{
24632543
return obj;
24642544
}
24652545
}
24662546

24672547
Object EqualityExpression() : {
2468-
Object obj = null;
2548+
Object obj = null, obj2 = null; Token op=null;
24692549
}
24702550
{
2471-
obj = RelationalExpression() [ ( "==" | "!=" ) EqualityExpression() { obj=null; } ]
2551+
obj = RelationalExpression()
2552+
(
2553+
(op="==" | op="!=") obj2 = RelationalExpression() { obj = computeBinaryValue(obj, op, obj2); } ) *
24722554
{
24732555
return obj;
24742556
}
24752557
}
24762558

24772559
Object RelationalExpression() : {
2478-
Object obj = null;
2560+
Object obj = null, obj2 = null; Token op=null;
24792561
}
24802562
{
2481-
obj = ShiftExpression() [ ( "<" | ">" | "<=" | ">=" ) RelationalExpression() { obj=null; } ]
2563+
obj = ShiftExpression()
2564+
(
2565+
(op="<" | op=">" | op="<=" | op=">=") obj2=ShiftExpression() { obj = computeBinaryValue(obj, op, obj2); }
2566+
) *
24822567
{
24832568
return obj;
24842569
}
24852570
}
24862571

24872572
Object ShiftExpression() : {
2488-
Object obj1 = null, obj2 = null;
2573+
Object obj = null, obj2 = null; Token op=null;
24892574
}
24902575
{
2491-
obj1 = AdditiveExpression()
2492-
[
2493-
"<<" obj2 = AdditiveExpression()
2494-
{ if (obj1 instanceof Long && obj2 instanceof Long) { return ((Long) obj1) << ((Long) obj2); } }
2495-
| ">>" obj2 = AdditiveExpression()
2496-
{ if (obj1 instanceof Long && obj2 instanceof Long) { return ((Long) obj1) >> ((Long) obj2); } }
2497-
]
2576+
obj = AdditiveExpression()
2577+
(
2578+
( op="<<" | op=">>" ) obj2 = AdditiveExpression()
2579+
{ obj = computeBinaryValue(obj, op, obj2); }
2580+
) *
24982581
{
2499-
return obj1;
2582+
return obj;
25002583
}
25012584
}
25022585

25032586
Object AdditiveExpression() : {
2504-
Object obj1 = null, obj2 = null;
2587+
Object obj = null, obj2 = null; Token op=null;
25052588
}
25062589
{
2507-
obj1 = MultiplicativeExpression() [
2508-
"+" obj2 = AdditiveExpression()
2509-
{ if (obj1 instanceof Long && obj2 instanceof Long) { return ((Long) obj1) + ((Long) obj2); } }
2510-
| "-" obj2 = AdditiveExpression()
2511-
{ if (obj1 instanceof Long && obj2 instanceof Long) { return ((Long) obj1) - ((Long) obj2); } }
2512-
]
2590+
obj = MultiplicativeExpression()
2591+
( ( op="+" | op="-" ) obj2 = MultiplicativeExpression()
2592+
{ obj = computeBinaryValue(obj, op, obj2); }
2593+
) *
25132594
{
2514-
return obj1;
2595+
return obj;
25152596
}
25162597
}
25172598

25182599
Object MultiplicativeExpression() : {
2519-
Object obj1 = null, obj2 = null;
2600+
Object obj = null, obj2 = null; Token op=null;
25202601
}
25212602
{
2522-
obj1 = CastExpression() [
2523-
"*" obj2 = ConstantExpression()
2524-
{ if (obj1 instanceof Long && obj2 instanceof Long) { return ((Long) obj1) * ((Long) obj2); } }
2525-
| "/" obj2 = ConstantExpression()
2526-
{ if (obj1 instanceof Long && obj2 instanceof Long) { return ((Long) obj1) / ((Long) obj2); } }
2527-
| "%" obj2 = ConstantExpression()
2528-
{ if (obj1 instanceof Long && obj2 instanceof Long) { return ((Long) obj1) % ((Long) obj2); } }
2529-
]
2603+
obj = CastExpression()
2604+
( ( op="*" | op="/" | op="%" ) obj2 = CastExpression()
2605+
{ obj = computeBinaryValue(obj, op, obj2); }
2606+
) *
25302607
{
2531-
return obj1;
2608+
return obj;
25322609
}
25332610
}
25342611

@@ -2537,8 +2614,11 @@ Object CastExpression() : {
25372614
}
25382615
{
25392616
(
2540-
LOOKAHEAD("(" TypeName() ")" CastExpression() )
2541-
"(" TypeName() ")" CastExpression()
2617+
LOOKAHEAD("(" TypeName() ")")
2618+
(
2619+
"(" TypeName() ")" ( CastExpression() |
2620+
( "{" InitializerList() [ "," ] "}" ) )
2621+
)
25422622
|
25432623
obj = UnaryExpression()
25442624
)
@@ -2550,18 +2630,27 @@ Object CastExpression() : {
25502630
Object UnaryExpression() : {
25512631
DataType dt = null;
25522632
Object obj = null;
2633+
Token op = null;
25532634
}
25542635
{
25552636
(
25562637
LOOKAHEAD(3)
2557-
obj = PostfixExpression()
2638+
obj = PostfixExpression()
2639+
|
2640+
UnaryOperator() CastExpression()
25582641
|
25592642
"++" UnaryExpression()
25602643
|
25612644
"--" UnaryExpression()
2645+
|
2646+
"+" obj=CastExpression()
2647+
|
2648+
op="-" obj=CastExpression() { obj = computeUnaryValue(obj, op); }
25622649
|
2563-
UnaryOperator() CastExpression()
2650+
op="~" obj=CastExpression() { obj = computeUnaryValue(obj, op); }
25642651
|
2652+
op="!" obj=CastExpression() { obj = computeUnaryValue(obj, op); }
2653+
|
25652654
<SIZEOF>
25662655
(
25672656
LOOKAHEAD(UnaryExpression() )
@@ -2580,9 +2669,13 @@ Object UnaryExpression() : {
25802669
}
25812670
}
25822671

2583-
void UnaryOperator() : {}
2672+
void UnaryOperator() : { }
25842673
{
2585-
( "&" | "*" | "+" | "-" | "~" | "!" )
2674+
(
2675+
"&"
2676+
|
2677+
"*"
2678+
)
25862679
}
25872680

25882681
Object PostfixExpression() : {
@@ -2591,22 +2684,22 @@ Object PostfixExpression() : {
25912684
{
25922685
obj = PrimaryExpression()
25932686
(
2594-
"[" Expression() "]"
2687+
( "[" Expression() "]" )
25952688
|
25962689
"("
25972690
[
25982691
LOOKAHEAD(ArgumentExpressionList() )
25992692
ArgumentExpressionList()
26002693
]
2601-
")"
2694+
")"
26022695
|
26032696
"." <IDENTIFIER>
26042697
|
26052698
"->" <IDENTIFIER>
26062699
|
26072700
"++"
26082701
|
2609-
"--"
2702+
"--"
26102703
)*
26112704
{
26122705
return obj;

0 commit comments

Comments
 (0)