智能合约审计工具(一)——cloc界定审计的代码数量,审计难度。cloc,solidity metrics 使用的入门,细节与解答

news2024/9/21 11:14:00

为什么要界定源代码数量

代码审计是一种评估软件代码质量、安全性和合规性的过程。在进行代码审计之前,先界定源代码的数量有以下几个原因:

  1. 审计范围的确定:了解源代码的规模可以帮助审计团队确定审计的范围和深度,从而制定合理的审计计划。

  2. 资源分配:源代码的数量直接影响到审计所需的时间和人力资源。大量的代码可能需要更多的时间来完成审计,因此需要合理分配审计资源。

  3. 风险评估:源代码的规模可以作为评估项目风险的一个因素。通常,代码量越大,潜在的漏洞和问题可能越多。

  4. 审计成本估算:了解源代码的数量有助于估算审计的成本。审计服务提供者可以根据代码量来报价。

  5. 审计方法选择:不同的代码量可能需要采用不同的审计方法。例如,对于较小的项目,可能可以进行手动审计;而对于较大的项目,则可能需要自动化工具来辅助审计。

  6. 审计时间估计:代码量的大小可以帮助审计团队估计完成审计所需的时间,从而为项目制定合理的时间表。

  7. 审计报告的详细程度:源代码的数量也会影响审计报告的详细程度。对于较小的代码库,可能可以提供更详细的审计报告;而对于较大的代码库,则可能需要更概括的报告。

  8. 合规性要求:在某些情况下,审计的深度和范围可能受到合规性要求的限制,源代码的数量可以帮助确定是否满足这些要求。

通过界定源代码的数量,审计团队可以更有效地规划审计过程,确保审计的质量和效率。

在我们进行审计之前应当首先了解以下内容
Stats

Use something like solidity metrics or cloc to get these.

nSLOC: XX
Complexity Score: XX
Security Review Timeline: Date -> Date

其中nSLOC,源代码的数量,下面的 Complexity Score有多种评估方式,一般而言,我们可以根据源代码数量进行评估,从而根据自己和团队的能力确定审计的日期Security Review Timeline: Date -> Date

代码难度的界定

对于 Complexity Score也有许多的方式界定:
复杂度分数(Complexity Score)是衡量代码复杂性的一个指标,它通常反映了代码的可读性、可维护性和潜在的错误风险。不同的编程语言和工具可能会使用不同的方法来计算复杂度分数。以下是一些常见的计算复杂度的方法:

  1. Cyclomatic Complexity(圈复杂度):

    • 由Thomas J. McCabe在1976年提出。
    • 计算方法:E - N + 2P,其中E是程序中边的数量,N是节点的数量,P是连接组件的数量。
    • 圈复杂度较高的模块可能需要更多的测试来确保其正确性。
  2. Halstead Complexity Measures(Halstead复杂度度量):

    • 由Maurice Halstead在1977年提出。
    • 包括多个度量,如程序长度(程序中操作符和操作数的总数)、体积(程序中不同操作符和操作数的数量)、难度(程序中不同操作符和操作数的比率)、估算工作量等。
  3. Maintainability Index(可维护性指数):

    • 考虑代码的圈复杂度、代码行数和注释比例。
    • 可维护性指数越高,代码的可维护性越好。
  4. Essential Complexity(本质复杂度):

    • 指的是即使最高效的算法也无法减少的复杂度。
  5. Logical Complexity(逻辑复杂度):

    • 考虑程序中逻辑结构的复杂性,如条件语句、循环等。
  6. Modularity(模块化):

    • 衡量代码的模块化程度,模块化程度越高,复杂度可能越低。
  7. Depth of Inheritance(继承深度):

    • 对于面向对象的语言,继承层次的深度可以影响复杂度。
  8. Coupling and Cohesion(耦合和内聚):

    • 耦合度衡量模块之间的相互依赖程度,内聚度衡量模块内部元素的关联程度。
  9. Lines of Code(代码行数):

    • 简单的行数统计,虽然不是直接的复杂度度量,但通常与复杂度相关。
  10. Static Analysis Tools(静态分析工具):

    • 使用自动化工具来检测代码中的潜在复杂性问题。

不同的工具和方法可能会结合上述一种或多种度量来计算复杂度分数。例如,一些工具可能会使用一个加权公式,将圈复杂度、代码行数、注释比例等因素结合起来,以提供一个综合的复杂度评分。

要计算复杂度分数,你通常需要使用专门的代码分析工具,这些工具可以自动计算上述度量,并给出一个综合评分。例如,对于Java代码,可以使用Checkstyle、PMD或SonarQube等工具;对于C/C++代码,可以使用Cppcheck或Clang Static Analyzer等。对于Solidity智能合约,可以使用Solidity Metrics等工具。

colc 的安装与使用

访问github官网
https://github.com/AlDanial/cloc
cloc
如果链接失效就在github搜索cloc
推荐选择Install via package manager下载
推荐选择Install via package manager下载这样你会看到多种安装方式,我选择

npm install -g cloc

进入项目目录中,输入

cloc file

这里的file是你想要界定源代码数量的审计文件夹的路径
举例,我的审计文件位于./src/

cloc ./src/
       1 text file.
       1 unique file.                              
       0 files ignored.

github.com/AlDanial/cloc v 2.02  T=0.03 s (32.7 files/s, 1342.7 lines/s)
-------------------------------------------------------------------------------
Language                     files          blank        comment           code
-------------------------------------------------------------------------------
Solidity                         1              6             15             20
-------------------------------------------------------------------------------

我们可以看到
根据 cloc 命令输出结果,我们可以分析如下:

  1. 文件统计:

    • 总共有1个文本文件被统计。
  2. 文件唯一性:

    • 有1个独特的文件,意味着没有重复的文件被计算。
  3. 忽略文件:

    • 没有文件被忽略。
  4. 版本和执行时间:

    • 使用的 cloc 版本是 2.02。
    • 执行时间是 0.03 秒,这表明分析速度很快。
  5. 文件处理速度:

    • 在这次分析中,cloc 处理了32.7个文件每秒,1342.7行代码每秒。
  6. 语言统计:

    • 统计结果显示,有一个文件是用 Solidity 语言编写的。
  7. 代码行数细分:

    • 在这个 Solidity 文件中:
      • 空白行(不包含代码的行)数量为 6 行。
      • 注释行(以 ///* */ 开始的行)数量为 15 行。
      • 实际的代码行数(不包括空白和注释)为 20 行。

这个输出结果提供了一个快速的概览,让你知道在 ./src/ 目录下有一个 Solidity 文件,以及这个文件的代码、注释和空白行的分布情况。这对于评估代码规模和进行初步的代码审查非常有用。

solidity Metrics

这个工具位于vscode 拓展当中,当我们下载之后,可以选择,文件点击鼠标右键,便可以看到solidity Metrics
若有人的电脑没有拓展或者是无法安装和加载,这里给出一种万能解决方法

我们直接使用node全局下载

npm install -g solidity-code-metrics

之后我们使用命令

solidity-code-metrics myfile.sol > metrics.md
solidity-code-metrics myfile.sol --html > metrics.html`

myfile.sol 更换成你需要的文件,这里可以得到许多的提示

TypeFileLogic ContractsInterfacesLinesnLinesnSLOCComment LinesComplex. ScoreCapabilities
📝/home/zqy/foundry/3-passwordstore-audit/src/PasswordStore.sol1****4141201510****
📝Totals1****4141201510****

可以清晰的看法到

nSLOC: 20
Complexity Score: 10

有不懂的欢迎联系我

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

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

相关文章

TCN合集(TCN、TCN-GRU、TCN--GRU--Attention、TCN-Bigru、TCN-BiGRU-Attention)

TCN、TCN-GRU、TCN-GRU-Attention、TCN-BiGRU、TCN-BiGRU-Attention)在结构原理上既有相似之处,也存在一些关键的不同点。以下是对这些模型的异同点以及它们之间优劣性的对比: TCN合集(TCN-GRU、TCN--GRU--Attention、TCN-Bigru等…

docker网络+跨主机容器之间的通讯

docker网络 使用docker network 查看桥 [rootdocker ~]# docker network ls NETWORK ID NAME DRIVER SCOPE 6cacea2a7a49 bridge bridge local 5546f1e40d41 host host local 2e567ec1e04f none null local bridge bridge和na…

使用c++编写com组件实现windows外壳扩展(自定义右键上下文菜单扩展)

一、作用 允许在 Windows 文件资源管理器中,当用户在文件、文件夹或空白处右键点击时,根据一定的逻辑显示自定义的菜单项 二、原理 COM组件 微软开发的一种软件架构模型,主要用于在不同编程语言之间实现二进制级别的可重用性和互操作性。…

文件上传面板中限制需要的文件格式,并且隐藏“所有文件”选项

直接说需求:需要实现在文件上传面板中限制需要的文件格式,并且不想展示“所有文件”这个选项,应该怎么做嘞?效果如下图: 这里用到了 window.showOpenFilePicker 方法实现,首先定义接受的格式及限制&#xf…

Python 生成随机的国内 ip

示例代码: import randomdef generate_random_cn_ip():# 中国大陆IP范围start_ip "36.54.0.0"end_ip "123.255.255.254"# 将IP地址转换为整数start_ip_num int(start_ip.replace(".", ""))end_ip_num int(end_ip.rep…

【FreeRTOS】信号量实验-控制车辆运行

目录 0 前言1 控制车辆运行2 不使用信号量3 使用计数型信号量3.1 运行两辆车运行3.2 运行三辆车运行 4 使用二进制信号量5 补充信号量知识5.1 两种信号量对比5.2 信号量函数5.3 创建5.4 删除5.5 Take / Give5.5.1 xSemaphoreGive5.5.2 pxHigherPriorityTaskWoken5.5.3 xSemapho…

库存零件耗尽 任天堂宣布停止New 3DS的维修服务

由于库存零件已耗尽,任天堂宣布自8月28日起停止接受New 3DS游戏机的维修服务。在今年3月份时,任天堂就宣布过2DS、New 3DS、New 3DS LL的维修服务将在库存零件耗尽后终止,目前来看2DS和New 3DS LL的维修服务还将继续,直到零件耗尽…

算法中常用的排序

1.概念 排序是将一组数据,依指定的顺序进行排列的过程. 2.排序的分类 (1).内部排序 指将需要处理的所有数据都加载到内部存储器中进行排序.包括:交换式排序法,选择式排序法和插入式排序法 (2).外部排序 数据量过大,无法全部加载到内存中,需要借助外部存储进行排序.包括:合并排序…

FTP主动与被动模式

文件传送协议FTP: 提供交互式访问FTP屏蔽了各计算机系统的细节,因⽽适合于在异构⽹络中任意计算机之间传送⽂件。 传统FTP默认不加密 工作模式:(站在服务器的角度) 主动模式:服务器主动使用TCP20端口发起数…

群晖NAS配置SFTP服务并结合内网穿透工具实现无公网IP远程传输文件

文章目录 前言1. 开启群晖SFTP连接2. 群晖安装Cpolar工具3. 创建SFTP公网地址4. 群晖SFTP远程连接5. 固定SFTP公网地址6. SFTP固定地址连接 前言 本文主要介绍如何将在群晖NAS中开启SFTP服务,并安装cpolar内网穿透工具配置公网地址,轻松打造一套高效、安…

LRN正则化是什么?

LRN正则化,全称为Local Response Normalization(局部响应归一化),是一种在深度学习,特别是在卷积神经网络(CNN)中常用的正则化技术。该技术旨在通过模拟生物视觉系统中的侧抑制现象,…

【第0003页 · 递归】N皇后问题

【前言】本文以及之后的一些题解都会陆续整理到目录中,若想了解全部题解整理,请看这里: 第0003页 N皇后问题 今天我们来看一个著名的问题:N皇后问题。在此之前,我们先温习一下递归的思想。当然,温习的方式…

阅读笔记:明朝那些事儿人间再无魏忠贤

持续了10多天时间,明朝那些事儿第八部人间再无魏忠贤截止到今天凌晨0:58分看完了,给我印象比较深刻的人物杨涟,努尔哈赤,孙承宗,袁崇焕,魏忠贤,皇太极,熊廷弼&#xff0c…

C#MDI子窗体通过TabControl列表显示的控制实现过程

类似excel表格中各个表单sheet的切换效果,使用tabcontrol控件实现类似的功能。效果如下: 过程涉及父窗体MDIParent1、子窗体main、自定义基础功能类MdiChildBase。 基础功能类MdiChildBase继承自Form创建,定义了一个委托SetTabControlDelega…

项目:基于TCP的文件传输系统

项目介绍: 模拟FTP原理:客户端连接服务器后,向服务器发送一个文件。文件名可以通过参数指定,服务器端接收客户端传来的文件(文件名随意),如果文件不存在自动创建文件,如果文件存在,…

2024年整理的自动化测试面试题及答案

selenium中如何判断元素是否存在? 没有提供原生的方法判断元素是否存在,一般我们可以通过定位元素异常捕获的方式判断selenium中hidden或者是display = none的元素是否可以定位到?不可以,想点击的话,可以用…

C# 爬虫技术:京东视频内容抓取的实战案例分析

摘要 随着互联网技术的飞速发展,数据的获取和分析变得愈发重要。爬虫技术作为数据获取的重要手段之一,广泛应用于各个领域。本文将重点探讨C#语言在京东视频抓取中的实现过程,分析其技术细节,并提供相应的代码实现。 引言 京东…

python学习之路 - 面向对象编程

目录 一、面向对象编程1、成员方法a、类的定义和使用b、案例 2、类和对象3、构造方法4、其他内置方法(魔术方法)5、面向对象三大特性——封装a、介绍:b、表现形式:私有成员变量与私有成员方法c、作用 6、面向对象三大特性——继承…

iview Cascader 组件动态数据回显

在使用Cascader组件动态加载数据后,编辑的时候回显会有问题 问题如下:回显的时候,如果是多级,只显示了一级且,中间会闪一下 经过多方查找资料发现,是callback造成的。给组件增加on-visible-change事件监听…

如何下载淘宝的主图视频

目录: 1、通过插件插件下载短视频 1)获取“Microsoft Edge扩展” 2)搜索“aix智能下载器” 3)将插件钉在浏览器上 4)嗅控并下载视频 2、从其他来源安装插件 1、通过插件插件下载短视频 1)获取“M…