fix: 全面代码审查 — 修复 3 CRITICAL + 4 HIGH 问题
CRITICAL: - parser: 6处栈数组加边界检查 (struct_init/decl/block/params/functions/structs) - codegen: return前跳过返回值alloca防止use-after-free - ast: NEW宏加NULL检查防止arena耗尽崩溃 HIGH: - main: shell元字符过滤防命令注入 - codegen: LLVMContext泄漏修复 (out_context参数) - codegen: f64隐式return用LLVMConstReal替代LLVMConstInt - sema: 返回类型与函数声明校验 其他: - parser/codegen: 递归深度限制1000层 - codegen: struct值类型不追踪cleanup (栈上数据不能free) 基于三份审查报告 (架构/code quality/安全) 修复。
This commit is contained in:
+12
-4
@@ -16,7 +16,8 @@ void test_codegen_simple_function() {
|
||||
AstNode* prog = ast_make_program(&a, fns, 1, NULL, 0, 1, 1);
|
||||
|
||||
const char* err = NULL;
|
||||
LLVMModuleRef mod = codegen_module(prog, &a, "test_mod", &err);
|
||||
LLVMContextRef ctx = NULL;
|
||||
LLVMModuleRef mod = codegen_module(prog, &a, "test_mod", &err, &ctx);
|
||||
ASSERT(mod != NULL);
|
||||
ASSERT(err == NULL);
|
||||
|
||||
@@ -26,6 +27,7 @@ void test_codegen_simple_function() {
|
||||
ASSERT(!failed);
|
||||
|
||||
LLVMDisposeModule(mod);
|
||||
LLVMContextDispose(ctx);
|
||||
arena_destroy(&a);
|
||||
}
|
||||
|
||||
@@ -48,7 +50,8 @@ void test_codegen_if_else() {
|
||||
AstNode* prog = ast_make_program(&a, fns, 1, NULL, 0, 1, 1);
|
||||
|
||||
const char* err = NULL;
|
||||
LLVMModuleRef mod = codegen_module(prog, &a, "test_mod2", &err);
|
||||
LLVMContextRef ctx2 = NULL;
|
||||
LLVMModuleRef mod = codegen_module(prog, &a, "test_mod2", &err, &ctx2);
|
||||
ASSERT(mod != NULL);
|
||||
|
||||
char* verify_err = NULL;
|
||||
@@ -56,6 +59,7 @@ void test_codegen_if_else() {
|
||||
ASSERT(!failed);
|
||||
|
||||
LLVMDisposeModule(mod);
|
||||
LLVMContextDispose(ctx2);
|
||||
arena_destroy(&a);
|
||||
}
|
||||
|
||||
@@ -77,7 +81,8 @@ void test_codegen_binary_ops() {
|
||||
AstNode* prog = ast_make_program(&a, fns, 1, NULL, 0, 1, 1);
|
||||
|
||||
const char* err = NULL;
|
||||
LLVMModuleRef mod = codegen_module(prog, &a, "test_mod3", &err);
|
||||
LLVMContextRef ctx3 = NULL;
|
||||
LLVMModuleRef mod = codegen_module(prog, &a, "test_mod3", &err, &ctx3);
|
||||
ASSERT(mod != NULL);
|
||||
|
||||
char* verify_err = NULL;
|
||||
@@ -85,6 +90,7 @@ void test_codegen_binary_ops() {
|
||||
ASSERT(!failed);
|
||||
|
||||
LLVMDisposeModule(mod);
|
||||
LLVMContextDispose(ctx3);
|
||||
arena_destroy(&a);
|
||||
}
|
||||
|
||||
@@ -105,11 +111,13 @@ void test_codegen_while_loop() {
|
||||
AstNode* prog = ast_make_program(&a, fns, 1, NULL, 0, 1, 1);
|
||||
|
||||
const char* err = NULL;
|
||||
LLVMModuleRef mod = codegen_module(prog, &a, "test_while", &err);
|
||||
LLVMContextRef ctx4 = NULL;
|
||||
LLVMModuleRef mod = codegen_module(prog, &a, "test_while", &err, &ctx4);
|
||||
ASSERT(mod != NULL);
|
||||
char* verify_err = NULL;
|
||||
ASSERT(!LLVMVerifyModule(mod, LLVMReturnStatusAction, &verify_err));
|
||||
LLVMDisposeModule(mod);
|
||||
LLVMContextDispose(ctx4);
|
||||
arena_destroy(&a);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user