pandatix/go-abnf
GitHub: pandatix/go-abnf
go-abnf是一个Go语言编写的ABNF解析器,支持RFC 5234和7405,用于解析和验证ABNF语法。
Stars: 12 | Forks: 2
Go模块用于处理增强型巴科斯-诺尔范式(ABNF),提供大型API。
它实现了RFC 5234和7405,以及勘误2968和3076。
功能:
- [X] 解析ABNF(到可操作的数据结构;具有循环检测)
- [X] 将ABNF编译为正则表达式
- [X] 创建一个涵盖完整语法的最小测试集
- [X] 生成提供的ABNF语法的可视化表示(mermaid)
- [X] 为您的模块创建ABNF模糊器(版本 >= Go1.18beta1)
- [X] 支持Unicode而不是UTF-8
## 工作原理
在底层,`go-abnf`是一个无依赖的暴力解析器。它为给定的语法和输入列出所有可能性,并返回所有可能的路径。然后必须评估这些路径以生成新的语法。
由于此实现不依赖于RFC 5234中定义的ABNF语法的ABNF语法,由RFC 7405更新并由勘误2968和3076修正,它实现了通用性。
这意味着对于任何在ABNF中有效且正确评估的语法,如果您可以为该语法编写一个评估器,则可以使用原始语法解析新的输入。为了初始化这个循环,我们必须硬编码ABNF语法的手动解析和评估,并多次审查。
示例可以在[示例目录](examples/)中找到
## 模糊测试
由于go-abnf围绕语法,您可以使用随机遍历来遍历其图并高效地根据给定的语法生成有效输入。
当您想要模糊测试需要非常特定输入格式的Go实现时,这尤其强大。
您可以使用go-abnf高效地生成测试用例,如下所示。
```
package example
import (
_ "embed"
"testing"
goabnf "github.com/pandatix/go-abnf"
)
//go:embed my-grammar.abnf
var myGrammar []byte
func FuzzFunction(f *testing.F) {
g, err := goabnf.ParseABNF(myGrammar)
if err != nil {
f.Fatal(err)
}
f.Fuzz(func(t *testing.T, seed int64) {
// Generate a random test case based on the seed
b, _ := g.Generate(seed, "a",
goabnf.WithRepMax(15), // Limit repetitions to 15
goabnf.WithThreshold(1024), // Stop ASAP input generation if reached 1024 bytes
)
Function(b)
})
}
```
## 故障排除
### 我的ABNF语法不起作用
**Q**:我的ABNF语法不起作用。您有什么想法吗?
**R**:可能有多种原因导致这种情况。首先确保您的语法以换行符(LF)结束,特别是输入内容有CR LF。由于这些看起来相同,这通常是错误的一个来源。
### pap和bap之间的区别
**Q**:pap和[bap](https://github.com/ietf-tools/bap)之间有什么区别?
**R**:是的,首先语言(即Go)使**更便携,因此可以集成到工作流程中**。但pap和bap之间的真正区别在于它们的工作方式:pap建立在挑战bap是否构建为向最终用户生成有意义错误的机会上。基于此,pap更进一步,它允许您从给定的语法构建**转换图**并模糊测试Go代码,还**支持Unicode代码点**,这可能很有用(例如,[TOML在ABNF中指定](https://github.com/toml-lang/toml/blob/main/toml.abnf))
标签:ABNF解析, API开发, EVTX分析, Go语言, Gradle, RFC标准, Runtime Enforcement, Unicode支持, 依赖管理, 数据管道, 数据结构, 日志审计, 模块化开发, 测试框架, 漏洞测试, 程序破解, 算法, 网络安全, 语法分析, 语法可视化, 语法生成, 语法评估, 语法遍历, 软件工程, 软件质量, 错误处理, 隐私保护