wangziwenhk / Riddle-Language

Riddle Language
Apache License 2.0
11 stars 7 forks source link

[Bug] 栈溢出 #12

Closed wangziwenhk closed 15 hours ago

wangziwenhk commented 2 days ago

例如以下代码

package main

fun main() -> int {
    for(;;){
        var a = 1
    }
    return 0
}

会造成栈溢出

wangziwenhk commented 2 days ago

我感觉是因为a在栈上分配的时候多次分配了内存导致的,我得把整个函数的所有变量都放到entry中

wangziwenhk commented 2 days ago

这是关于Clang的实现

int main(){
    for(;;){
        int a = 1;
    }
}

Out:

define dso_local noundef i32 @main() #0 {
  %1 = alloca i32, align 4
  %2 = alloca i32, align 4
  store i32 0, ptr %1, align 4
  br label %3

3:                                                ; preds = %3, %0
  store i32 1, ptr %2, align 4
  br label %3, !llvm.loop !5
}

这个似乎是预先分配的

bsdxm commented 1 day ago

一般情况下,这样的代码是非良构的,因为它不遵循了"清晰的退出条件"的编程原则。kotlin 我不知道,C++预计在C++26取消此规则

bsdxm commented 1 day ago

但为了内存安全,还是要改的

wangziwenhk commented 1 day ago

你搁这说什么呢

wangziwenhk commented 1 day ago

一般情况下,这样的代码是非良构的,因为它不遵循了"清晰的退出条件"的编程原则。kotlin 我不知道,C++预计在C++26取消此规则

我们在讨论栈溢出你跟我讲设计?

wangziwenhk commented 1 day ago

对于所有bodyStmt,我们需要获取其中的varDefineStmt并加载到entry中,但这可能破坏原本的内存分配策略