Rust这5个自动验证工具,你知道几个?

news2024/10/7 3:22:45

自动验证是一种有助于检查程序是否满足某些属性的技术,例如内存安全性和避免在运行时错误。此外,自动验证工具使你能够验证并发代码的正确性,这很难手工测试。

自动验证对Rust特别重要,因为它可以帮助确保正确使用unsafe的代码。在这篇文章中,我们将讨论五个最常用的Rust验证工具,以及它们如何帮助你构建更可靠的软件。

开始之前,介绍一下​最近很火的开源技术,低代码。

作为一种软件开发技术逐渐进入了人们的视角里,它利用自身独特的优势占领市场一角——让使用者可以通过可视化的方式,以更少的编码,更快速地构建和交付应用软件,极大程度地降低了软件的开发、配置、部署和培训成本。

应用地址: https://www.jnpfsoft.com
开发语言:Java/.net

这是一个基于 Java Boot/.Net Core 构建的简单、跨平台快速开发框架。前后端封装了上千个常用类,方便扩展;采用微服务、前后端分离架构,集成了代码生成器,支持前后端业务代码生成,满足快速开发;框架集成了表单、报表、图表、大屏等各种常用的 Demo 方便直接使用;后端框架支持 Vue2、Vue3,平台即可私有化部署,也支持 K8S 部署。

1,cargo-fuzz

我们将讨论的第一个工具是cargo-fuzz,它使用一种称为模糊测试的技术来进行自动化软件测试。通过向程序提供许多有效的、几乎有效的或无效的输入,模糊测试可以帮助开发人员找到不希望看到的行为或漏洞。

当我们编写测试时,我们通常只考虑一些正常输入,并根据我们对系统反应的想象来编写测试。这种方法可能会导致遗漏错误,特别是那些由意外的或不正确的输入引起的错误。

模糊测试可以通过为程序提供各种各样的输入(包括无效的和意外的输入)来帮助你找到这些遗漏的错误。如果程序在响应这些输入时崩溃或行为异常,则表示存在错误。

cargo-fuzz crate可以对Rust代码进行模糊测试,它的工作原理是生成随机输入,并将它们输入到要测试的函数中。如果函数出现故障或崩溃,cargo-fuzz将保存导致故障的输入。

通过以下命令安装cargo-fuzz:

复制

cargo install cargo-fuzz
  • 1.

下面是一个如何使用cargo-fuzz对Rust函数进行模糊测试的例子:

复制

#![no_main]
#[macro_use]
extern crate libfuzzer_sys;
fuzz_target!(|data: &[u8]| {

    let json_string = std::str::from_utf8(data).unwrap();
    let _ = serde_json::from_str::<serde_json::Value>(&json_string).unwrap();

});
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.

上面的代码通过向JSON解析器提供随机输入来测试它。fuzz_target将持续被调用,直到遇到触发panic并导致崩溃的输入。

注意:通过模糊测试发现的一些错误可能在现实生活中不实用或不适用,这意味着模糊测试可能会产生误报。此外,模糊测试可能是资源密集型的,特别是在对大型或复杂的代码库进行模糊测试时。

2,Kani

Kani是一个现代的自动代码验证工具,可以帮助你在几秒钟内验证Rust代码的正确性。它使用一种称为模型检查的技术,一种探索程序所有状态的方法,包括通过正常执行无法到达的状态。

模型检查允许Kani检测代码中的问题,这些问题可能是由意外的逻辑引起的。还可以使用Kani来识别单元测试、集成测试甚至手工测试很难或不可能发现的问题。

通过以下命令安装Kani:

复制

cargo install --locked kani-verifier
cargo kani setup
  • 1.
  • 2.

让我们看一下下面的代码:

复制

fn product(a: i32, b: i32) -> i32 {
    a * b
}
  • 1.
  • 2.
  • 3.

上面的代码是有效的Rust代码,对吗?花点时间再看一遍——你能发现这段代码有什么可能出错的地方吗?

让我们用Kani来找出答案:

复制

fn product(a: i32, b: i32) -> i32 {
    a * b
}

#[kani::proof]
fn main() {
    let a = kani::any();
    let b = kani::any();
    let result = product(a, b);
    println!("The product of {} and {} is {}", a, b, result);
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.

运行结果:

图片

图片

Kani在乘法过程中发现了溢出的可能性。

这是因为product函数不能确保我们不超过i32的最大值,即2,147,483,647,任何大于该数的值都会抛出错误。本质上,无论这个函数用于什么,它都不能处理大于20亿的数字。

在这种情况下,使用Kani来识别这个潜在的问题允许您要么立即更改数据类型,要么保持原样,如果错误是预期的行为,则适当地处理错误。

3,Proptest

Proptest使用大量有效和无效的输入来测试函数的属性,以发现bug。这与单元测试等经典测试方法不同,在单元测试中,指定一些输入并根据期望的行为添加断言。

属性测试是模糊测试的一种形式,它更容易控制,更侧重于验证特定的属性。这使得它成为测试复杂系统的一个很好的选择,在这些系统中,传统的模糊测试可能太慢或无效。

让我们来看看如何使用Proptest crate:

复制

use proptest::prelude::{any, proptest};

fn add_two_numbers(first_number: i32, second_number: i32) -> i32 {
    first_number + second_number
}

proptest! {
    #[test]
    fn test_add_two_numbers(first_number in any::<i32>(), second_number in any::<i32>()) {
        let expected = first_number + second_number;
        let actual = add_two_numbers(first_number, second_number);
        assert_eq!(actual, expected);
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.

在上面的代码中,我们正在测试一个简单的函数,它将两个数字相加。这样一个简单的函数可能会出什么问题呢?

让我们看一下test_add_two_numbers函数签名:

复制

fn test_add_two_numbers(first_number in any::<i32>(), second_number in any::<i32>())
  • 1.

any::<i32>()是一个Protest中的类型,它生成随机的i32值,包括有效的和无效的。这允许我们使用广泛的输入来测试add_two_numbers()函数,包括边缘情况和异常情况。

Proptest测试函数将为first_number和second_number参数生成大量随机输入。如果任何测试失败,Proptest将把失败的输入打印到控制台。

图片

图片

报告显示有溢出的可能,它还显示了最小的可重复输入。有了这些信息,我们就可以继续修复bug了。

虽然属性测试可以很好地用于选定的输入范围,但它有时会遗漏一些边缘情况,并给你一个假结果。换句话说,它可能会在实际上没有错误的情况下产生错误,或者在指定的覆盖范围之外找不到错误。

4,Rust KLEE

KLEE是一个符号执行引擎,它智能地探索程序中的所有代码路径,以发现漏洞或错误。它建立在LLVM编译器基础设施之上,该基础设施是用C和C++编写的。

因此,大多数KLEE实现也是用C和C++语言实现的。然而,KLEE的基本概念可以在任何编程语言中实现。

Rust Klee是Klee的开源Rust实现,被设计用来检查特定的属性。

  • 安全检查
  • 不变量
  • 参数化的检查
  • 检查Rust程序的功能正确性

Rust Klee还没有准备好用于生产,但它仍然值得一提,它是一个很酷的工具,可以帮助在Rust生态系统中形成正式的验证环境。

5,Haybale

Haybale也是一个符号执行引擎,具有与Rust Klee相似的功能,Haybale完全是用Rust编写的,并且在底层基于Rust LLVM IR。

作为一个符号执行引擎,它专注于将整个程序变量转换为数学表达式,并对执行路径进行推理,以检测错误或漏洞。Haybale最好的部分是它可以测试你的Rust代码,而不需要添加额外的测试代码。

让我们看一个检查函数foo是否返回0的例子。首先,我们写出要分析的函数,你可以用任何编程语言写这个,然后把它转换成字节码:

复制

fn foo(x: f64) -> f64 {
  x * x - 4.0
}
  • 1.
  • 2.
  • 3.

字节码将保存在项目的某个地方,你可以在Rust代码的项目变量中引用它:

复制

let project = Project::from_bc_path("/path/to/file.bc").unwrap();
  • 1.

现在,我们可以使用haybale中的find_zero_of_func方法来发现当函数接收到零输入时存在的错误。

复制

use haybale::{find_zero_of_func, Project};

fn main() {
  let project = Project::from_bc_path("/path/to/file.bc").unwrap();
  match find_zero_of_func("foo", &project, haybale::Config::default(), None) {
    Ok(None) => println!("foo() can never return 0"),
    Ok(Some(inputs)) => println!("Inputs for which foo() returns 0: {:?}", inputs),
    Err(e) => panic!("{}", e),
  }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.

Haybale可以对整个代码进行推理,发现bug,并返回一份报告,证明代码是否存在bug。虽然Haybale可能不会捕获所有错误,但它很可能会捕获导致运行时崩溃的严重错误,并给你一个修复它们的机会。

总结

自动验证工具对于发现软件开发中的bug非常重要,尽管它们可能尚未被开发人员广泛采用。这些工具可以发现使用传统测试方法无法发现的错误,并且可以提高代码的可靠性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1846964.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

NTFS和exFAT哪个性能好 U盘格式化NTFS好还是exFAT好 mac不能读取移动硬盘怎么解决

文件系统的选择对存储设备的性能和兼容性有着重要影响。而NTFS和EXFAT作为两种常见的文件系统&#xff0c;它们各有特点&#xff0c;适用于不同的使用场景。我们将深入探讨NTFS和EXFAT的区别&#xff0c;帮助大家选择最适合自己需求的文件系统。 NTFS&#xff1a;稳定与性能的平…

代理网络基础设施 101:增强安全性、速度和可扩展性

编辑代理网络在现代网络架构中发挥着重要作用&#xff0c;充当管理和重新路由数据流的中介。它们处理的数据可以是各种类型&#xff0c;包括搜索查询和潜在的敏感客户信息&#xff0c;这凸显了它们在数据安全方面的作用。 然而&#xff0c;代理的好处不仅限于安全性。它们为用…

Apifox 中如何处理加密或编码过的响应数据?

接口返回的响应数据有时是经过编码或加密处理的&#xff0c;要转换成可读的明文&#xff0c;可以使用 Apifox 内置的 JS 类库、或者通过调用外部编程语言 &#xff08;如 Python、JavaScript 等&#xff09; 来进行处理。 例如&#xff0c;一个经过 Base64 编码的数据可以通过…

【开源项目】智慧北京案例~超经典实景三维数字孪生智慧城市CIM/BIM数字孪生可视化项目——开源工程及源码!

飞渡科技数字孪生北京管理平台&#xff0c; 依托实景数字孪生底座&#xff0c;以城市感知网络为硬件基础&#xff0c;以城市大数据为核心资源&#xff0c;以数字孪生、云计算、人工智能为关键技术&#xff0c;实现城市产业规划、资产安全管理、城市能耗监控等一体化空间融合。 …

我国光伏连接器市场规模逐渐扩大 国产化率不断提升

我国光伏连接器市场规模逐渐扩大 国产化率不断提升 光伏连接器是在光伏系统中用于连接控制器、汇流箱、逆变器等各组件的设备。光伏连接器是光伏系统的“生命线”&#xff0c;可确保有效的能量传输&#xff0c;并尽量减少系统中的任何功率损失。光伏连接器具有防水、防尘、电压…

The First项目报告:解读互链操作协议LayerZero

随着 DeFi 项目的兴起&#xff0c;跨链互操作性成为区块链领域的热门话题&#xff0c;在众多的跨链平台中&#xff0c;Layer Zero 凭借其创新技术和设计备受关注&#xff0c;近期Layer Zero发布代币空投方案&#xff0c;引发社区热议&#xff0c;随着其代币上线The First平台&a…

Vue69-路由基本使用

一、需求 二、开发步骤 2-1、路由的安装 vue-router3才能在vue2中使用&#xff01;现在默认是vue-router4版本&#xff0c;要在vue3中使用&#xff01;所以&#xff0c;安装的时候要指定版本。 2-2、在main.js中引入和使用路由 2-3、创建router文件夹 一般在vue中用了vue-ro…

SpringBoot引入外部依赖包

将需要引入的文件放置到与src同级别的目录下 如上&#xff0c;在src的同级&#xff0c;新建了一个lib目录&#xff0c;将jar包放置其中 在POM文件下&#xff0c;加入如下配置 <dependency><groupId>com.aliyun</groupId><artifactId>com.aliyun.filed…

电脑蓝屏修复|你的设备遇到问题,需要重启。我们只收集某些错误信息,然后为你重新启动。100% 完成 终止代码: 0xc000021a

问题描述 今天莫名其妙电脑打不开了&#xff0c;一直如上图所示蓝屏&#xff0c;重启也不行 问了某电脑店的客服&#xff0c;说修复需要50元&#xff0c;真黑啊&#xff0c;果断自己搜方法&#xff0c;怒省50大洋hh 修复方法 重启电脑三次&#xff0c;第三次触发电脑的自动修…

ShuffleNet系列论文阅读笔记(ShuffleNetV1和ShuffleNetV2)

目录 ShuffleNet: An Extremely Efficient Convolutional Neural Network for Mobile Devices摘要Approach—方法Channel Shuffle for Group Convolutions—用于分组卷积的通道重排ShuffleNet Unit—ShuffleNet单元Network Architecture—网络体系结构 总结 ShuffleNet V2: Pra…

mybatis查询PostgreSQL报错:无法确定参数 $1 的数据类型

错误信息 ### Cause: org.postgresql.util.PSQLException: 错误: 无法确定参数 $1 的数据类型 ; bad SQL grammar []; nested exception is org.postgresql.util.PSQLException: 错误: 无法确定参数 $1 的数据类型] with root cause org.postgresql.util.PSQLException: 错误: …

如何搭建一个成功的短剧制作平台

要搭建一个成功的短剧制作平台&#xff0c;需要考虑多个方面&#xff0c;包括目标定位、技术选择、内容管理、用户体验等。 1、明确目标和定位&#xff1a; 确定你的目标受众是谁&#xff0c;他们的年龄、兴趣、消费习惯等。 明确短剧制作平台的主要定位&#xff0c;是提供原创…

一个很好用的地图工具的使用:思极地图,以及vue+思极地图的使用

前言&#xff1a; 随着现在国网等一部分公司的需求&#xff0c;在线地图-思极地图 出现在我们眼前&#xff0c;给我们带来了很多便利&#xff0c;这里分享下他的信息与使用。 实现效果&#xff1a; 相关资料&#xff1a; 1、官网地址 2、在线地址 3、官方api地址 实现步骤-js…

Nvidia Isaac Sim组装机器人和添加传感器 入门教程 2024(5)

Nvidia Isaac Sim 入门教程 2024 版权信息 Copyright 2023-2024 Herman YeAuromix. All rights reserved.This course and all of its associated content, including but not limited to text, images, videos, and any other materials, are protected by copyright law. …

椭圆的几何要素

椭圆的几何要素 flyfish 椭圆的方程为 x 2 a 2 y 2 b 2 1 \frac{x^2}{a^2} \frac{y^2}{b^2} 1 a2x2​b2y2​1。 长半轴 a a a&#xff08;绿色虚线&#xff09;和短半轴 b b b&#xff08;紫色虚线&#xff09;。 焦点 F 1 ( − c , 0 ) F1(-c, 0) F1(−c,0)&#…

【C语言】解决C语言报错:Segmentation Fault

文章目录 简介什么是Segmentation FaultSegmentation Fault的常见原因如何检测和调试Segmentation Fault解决Segmentation Fault的最佳实践详细实例解析示例1&#xff1a;未初始化指针示例2&#xff1a;数组越界示例3&#xff1a;使用已释放的内存示例4&#xff1a;递归导致栈溢…

vscode安装所需插件 个人记录版

vscode安装所需插件 个人记录版 仅做参考 设置

LangChain入门学习笔记(六)—— Model I/O之Output Parsers

当大模型产生输出返回后&#xff0c;它的内容更像是一段平铺的文字没有结构。在传给下游节点处理时可能并不能符合输入要求&#xff0c;LangChain提供了一套机制使得模型返回的内容可以按照开发者定义的那样结构化。 在官网文档中可以看到LangChain提供了丰富的输出解析器&…

Solana链,什么是sol跟单机器人、pump跟单机器人、sol狙击机器人、sol夹子机器人、sol聪明钱筛选

Solana Sol跟单机器人&#x1f916; SOL跟单机器人&#xff08;Copy Trading Bot&#xff09;是一种自动化交易工具&#xff0c;允许用户复制其他成功交易者的交易行为。这种机器人通常用于加密货币市场、外汇市场等金融市场。以下是SOL跟单机器人的一些关键特性和功能&#xf…

优维“态势感知监控”产品:像“上帝”一样掌控应用系统

什么是态势感知&#xff1f; 态势感知是一种基于环境的、动态、整体地洞悉全网安全风险的能力。它以安全大数据为基础&#xff0c;从全局视角对全网安全威胁进行发现识别、理解分析展示和响应处置&#xff0c;并预测发展趋势&#xff0c;为后续网络安全的相关决策与行动提供数据…