ghidra icon indicating copy to clipboard operation
ghidra copied to clipboard

C Parser fail to parse a simple function

Open Hinara opened this issue 1 year ago • 3 comments

Describe the bug The C Parser crash without a clear error on why on a simple case.

To Reproduce Steps to reproduce the behavior:

  1. Create a C file
  2. Put the below content into it
unsigned long HandleToULong(void *h){}
  1. Parse it with the C Parser
  2. The C Parser generate an error

Expected behavior Should not produce any errors.

Environment (please complete the following information):

  • OS: Windows
  • Java Version: java 17.0.2 2022-01-18 LTS
  • Ghidra Version: ghidra_10.1.5_PUBLIC
  • Ghidra Origin: official GitHub distro

Additional context When using a void return type or removing the parameter the C Parser works again

Console output:

INFO  parse C:\Users\XXX\a.c (CParserPlugin)
WARN  db.NoTransactionException: Transaction has not been started (CParser) db.NoTransactionException: Transaction has not been started
        at db.DBHandle.checkTransaction(DBHandle.java:396)
        at db.Table.putRecord(Table.java:938)
        at ghidra.program.database.data.CategoryDBAdapterV0.createCategory(CategoryDBAdapterV0.java:87)
        at ghidra.program.database.data.DataTypeManagerDB.createCategoryDB(DataTypeManagerDB.java:738)
        at ghidra.program.database.data.CategoryDB.createCategory(CategoryDB.java:311)
        at ghidra.program.database.data.DataTypeManagerDB.createCategory(DataTypeManagerDB.java:1945)
        at ghidra.program.database.data.DataTypeManagerDB.createCategory(DataTypeManagerDB.java:1943)
        at ghidra.program.database.data.DataTypeDB.doSetCategoryPath(DataTypeDB.java:350)
        at ghidra.program.database.data.DataTypeDB.setCategoryPath(DataTypeDB.java:336)
        at ghidra.app.util.cparser.C.CParser.addDef(CParser.java:294)
        at ghidra.app.util.cparser.C.CParser.FunctionDefinition(CParser.java:892)
        at ghidra.app.util.cparser.C.CParser.ExternalDeclaration(CParser.java:762)
        at ghidra.app.util.cparser.C.CParser.TranslationUnit(CParser.java:750)
        at ghidra.app.util.cparser.C.CParser.parse(CParser.java:630)
        at ghidra.app.plugin.core.cparser.CParserPlugin.parse(CParserPlugin.java:384)
        at ghidra.app.plugin.core.cparser.CParserTask.run(CParserTask.java:70)
        at ghidra.util.task.Task.monitoredRun(Task.java:134)
        at ghidra.util.task.TaskRunner.lambda$startTaskThread$0(TaskRunner.java:106)
        at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
        at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
        at java.base/java.lang.Thread.run(Thread.java:833)

C Parser:  Problem Parsing.
          in C:\Users\XXX\a.c near line 1
         Last Valid Datatype: HandleToULong
         Check around CParserPlugin.out around line: 3

INFO  Parse Errors: C Parser:  Problem Parsing.
          in C:\Users\XXX\a.c near line 1
         Last Valid Datatype: HandleToULong
         Check around CParserPlugin.out around line: 3
 (CParserTask$3)
ERROR Failed to dispose PackedDatabase - it may still be in use!
C:\Users\XXX\Desktop\directx2.gdt (PackedDatabase) java.lang.Exception
        at ghidra.framework.store.db.PackedDatabase.dispose(PackedDatabase.java:331)
        at ghidra.program.model.data.FileDataTypeManager.close(FileDataTypeManager.java:233)
        at ghidra.app.plugin.core.cparser.CParserTask.run(CParserTask.java:140)
        at ghidra.util.task.Task.monitoredRun(Task.java:134)
        at ghidra.util.task.TaskRunner.lambda$startTaskThread$0(TaskRunner.java:106)
        at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
        at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
        at java.base/java.lang.Thread.run(Thread.java:833)

Hinara avatar Aug 01 '22 01:08 Hinara

Why should the C parser be responsible for parsing invalid C that doesn't compile. Your prototype says return unsigned long and you don't return anything.

mumbel avatar Aug 01 '22 03:08 mumbel

I just made the shortest usable example, the presence of the return statement doesn't change anything

Hinara avatar Aug 02 '22 04:08 Hinara

And this is valid C by the way https://stackoverflow.com/a/9936090 It create undefined behaviour at runtime but still valid.

Hinara avatar Aug 02 '22 04:08 Hinara

Error should be fixed in the next set of commits to master.

emteere avatar Oct 13 '22 05:10 emteere

Fixed by e42c1f1f3263e192d5d9042c14f1f25413931aa0

ryanmkurtz avatar Oct 14 '22 07:10 ryanmkurtz