博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
一种通用递归深度检测技术 - 基于栈帧内容的检测 - Golang语言描述
阅读量:6985 次
发布时间:2019-06-27

本文共 897 字,大约阅读时间需要 2 分钟。

背景

在递归处理的调用中,在具体的工程实践中一般会引入递归深度检测,防止因为错误的数据造成系统的资源极大的消耗,本方法定义了一种通用简单的递归检查方法。

步骤

实现函数RecursiveDepthChecker

func RecursiveDepthChecker(max int) bool {    //注意,这里我们跳过了本函数自己的栈,找到父调用的函数名    caller, _, _, _ := runtime.Caller(1)    currentFuncName := runtime.FuncForPC(caller).Name()    stack := make([]byte, 65535*1) //max 1MB stack traceback    //由于Golang Runtime中很多关于栈的函数未导出,无法使用。因此使用最肮脏的字符串检测方法    runtime.Stack(stack, false)    start := 0    depth := 0    for {        count := strings.Index(string(stack[start:]), currentFuncName)        if count >= 0 {            start += count + len(currentFuncName)            depth++        } else {            break        }    }    if depth > max {        return false    }    return true}

在需要进行检测的函数用引入检查即可

func TFunc() {    fmt.Println("Start Caller...")    if !RecursiveDepthChecker(5) {        fmt.Println("Stack Overflow")        return    }    TFunc()}

转载地址:http://csqpl.baihongyu.com/

你可能感兴趣的文章
Laravel学习笔记之Session源码解析(上)
查看>>
【转】程序语言的常见设计错误(1) - 片面追求短小
查看>>
Java NIO vs. IO
查看>>
【VNC】Linux环境VNC服务安装、配置与使用
查看>>
打包错误--Error:A problem was found with the configuration of task ':app:packageRelease'.
查看>>
D3.js系列——动态效果和Update、Enter、Exit的理解
查看>>
Docker查看关联容器的卷宗在本机的存储位置
查看>>
coding利用Webhook实现Push代码后的jenkins自动构建
查看>>
GCD与dispatch_group总结
查看>>
Add Two Numbers
查看>>
用Thymeleaf在前台下拉列表取值
查看>>
Java strictfp
查看>>
新建jsp项目
查看>>
numpy.loadtxt()
查看>>
Chrome 调用vue.js 记录
查看>>
将float转换为数据类型numeric时出现算术溢出错误
查看>>
java基础-回调函数(callback)
查看>>
Sqlserver2008R2配置数据库镜像之我的经验总结
查看>>
会长大人的《从小麦到馒头的过程》
查看>>
RDS经典网络平滑迁移到VPC的混访方案
查看>>