ghidra
ghidra copied to clipboard
C Parser fail to parse a simple function
Describe the bug The C Parser crash without a clear error on why on a simple case.
To Reproduce Steps to reproduce the behavior:
- Create a C file
- Put the below content into it
unsigned long HandleToULong(void *h){}
- Parse it with the C Parser
- 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)
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.
I just made the shortest usable example, the presence of the return statement doesn't change anything
And this is valid C by the way https://stackoverflow.com/a/9936090 It create undefined behaviour at runtime but still valid.
Error should be fixed in the next set of commits to master.
Fixed by e42c1f1f3263e192d5d9042c14f1f25413931aa0