软件质量保障与测试 Lab2

Lab2

  • 1
  • 2
    • 修改代码
    • 执行结果
    • 问题解决
  • 3
    • 修改代码
    • 执行结果
    • 问题解决

1

kleesymbolic.c 生成文件的执行结果:

在这里插入图片描述


2

修改代码

  • 头文件引用添加:
#include <klee/klee.h>
  • 执行部分:

将原先的读入:

int main() {
  maze[y][x] = 'X';
  read(0, program, ITERS);
  ...
}

修改为可以进行符号执行的对象

int main() {
  maze[y][x] = 'X';
  klee_make_symbolic(program,ITERS,"program");
  ...
}
  • 加入成功后添加断言:
void win() {
  printf("You win!\n");
  klee_assert(0);
  printf("Your solution: %s\n", program);
  exit(0);
}

执行结果

kleemaze.c 生成文件的执行结果,klee 生成的测试用例在 maze.c 上的执行结果:

可以看到 306 306 306 个测试用例中有 1 1 1 个出错

在这里插入图片描述


找到是 143 143 143 号出现错误

在这里插入图片描述


查看这个错误用例的详细情况:发现它的解决方案是 sddwddddsddw

在这里插入图片描述


编译执行步骤 sddwddddsddw,复现一下该场景
可以从下面看出,这两步中出现了穿墙的问题

在这里插入图片描述

在这里插入图片描述


问题解决

可以看出,以上两种穿墙的情况,均符合以下代码中第二个 if 判断格子是否为空时: !((y == 2 && maze[y][x] == '|' && x > 0 && x < W)) 的触发条件

原代码:

void status() {
  if (maze[y][x] == '#') {
    win();
  }
  if (maze[y][x] != ' ' &&
        !((y == 2 && maze[y][x] == '|' && x > 0 && x < W))) {
    x = ox;
    y = oy;
  }
  if (ox == x && oy == y) {
    lose();
  }
}

于是只需将该条件删去即可
代码修改为:

void status() {
  if (maze[y][x] == '#') {
    win();
  }
  if (maze[y][x] != ' ') {
    x = ox;
    y = oy;
  }
  if (ox == x && oy == y) {
    lose();
  }
}

再次编译执行后得到:

在这里插入图片描述

找到 error 所在以及正确的迷宫解决方法 ssssddddwwaawwddddssssddwwww
在这里插入图片描述


3

修改代码

将原 main 函数修改为:

int main() {
    struct BST *tree = malloc(sizeof(struct BST));

    int n;
    int len = 5;
    klee_make_symbolic(&n, sizeof(n), "n");
    klee_assume(n > 0 && n <= len);

    int num[len];
    klee_make_symbolic(num, sizeof(num),"num");
    for (int i = 0; i < n; i++) {
        insert(tree, num[i]);
    }

    // Inorder traversal of the BST:
    printInorder(tree);
    printf("\n");

    for (int i = 0; i < n; i++) {
        klee_assert(search(tree, num[i]) == 1);
    }

    for (int i = 0; i < n; i += 2) {
        int deleteVal = i;
        deleteNode(tree->root, deleteVal);
    }

    for (int i = 0; i < n; i += 2) {
        klee_assert(search(tree, num[i]) == 0);
    }

    // Inorder traversal of the BST:
    printInorder(tree);
    printf("\n");
    return 0;
}

执行结果

执行一段时间后停止
找到问题:在 main 函数调用 deleteNode 时出错
再继续向下发现:在 main 函数执行 deleteNode 时,默认根节点不改变,导致根节点右子树为空时出错

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


问题解决

应该用 deleteNode 返回值更新根节点,删除节点的代码修改为:

	for (int i = 0; i < n; i += 2) {
        int deleteVal = num[i];
        tree->root = deleteNode(tree->root, deleteVal);
    }

执行结果如下,可以看出该问题已解决。

在这里插入图片描述

在这里插入图片描述


再通过直接编译执行验证问题解决情况

原代码:

for (int i = 1; i < argc; i += 2) {
        int deleteVal = i;
        deleteNode(tree->root, deleteVal);
    }

修改后:

for (int i = 1; i < argc; i += 2) {
 int deleteVal = atoi(argv[i]);
 tree->root = deleteNode(tree->root, deleteVal);
 }

执行结果如下,发现 deleteNode 错误修改完毕
在这里插入图片描述


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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Wakeup Source框架设计与实现

Wakeup Source 为系统组件提供了投票机制&#xff0c;以便低功耗子系统判断当前是否可以进入休眠。 Wakeup Source(后简称&#xff1a;WS) 模块可与内核中的其他模块或者上层服务交互&#xff0c;并最终体现在对睡眠锁的控制上。 1. 模块功能说明 WS的处理逻辑基本上是围绕 com…

Python初步使用教程

1.基本输出print函数 a10 b20 print(a)#输出结束后会自动换行 print(b) print(a,b,猪猪侠)#print中sep决定三者之间会存在空格#连接方法一 print(猪猪,end) print(侠) #连接方法二&#xff08;只能是字符串和字符串连&#xff09; print(超级无敌)print(chr(67)) print(ord(猪…

内存经验分享

目录 内存统计工具 /proc/meminfo Buddy ​​​​​​​​​​​​​​Slub ​​​​​​​Procrank /proc/pid/smaps ​​​​​​​Dumpsys meminfo 内存评估 内存泄漏 Lmk 水位调整 内存统计工具 /proc/meminfo 可以提供整体内存信息&#xff0c;各字段表示的意思如…

Ant Design Pro

一&#xff1a;Ant Design pro是什么&#xff1a; Ant Design Pro 是基于 Ant Design 和 umi 的封装的一整套企业级中后台前端/设计解决方案&#xff0c;致力于在设计规范和基础组件的基础上&#xff0c;继续向上构建&#xff0c;提炼出典型模板/业务组件/配套设计资源&#x…

[linux] 上手新ubuntu机器的初始化工作(自用侵删)

文章目录 环境类Vimzshother 应用类Typora激活环境准备解包替换文件app.asar激活Typora VsCodeextension.vscode乱码 WattToolkitQQWPS输入法:FcitxDeepin-wine : Wechat 环境类 Vim 直接贴配置 vim-Plug: let mapleader "," let g:mapleader "," le…

攻防世界---misc---小小的PDF

1、题目描述&#xff0c;下载附件是一个PDF&#xff0c;打开之后是这样&#xff0c;有两页PDF 2、用winhex分析&#xff0c;没有发现奇怪的地方 3、在kali中binwalk发现有多张照片 4、接着使用foremost将图片分离出来&#xff0c; 5、得到3张图片&#xff0c;打开第3张图片&am…

【TB作品】MSP430F5529 单片机,智能温控系统,DS18B20

作品功能 本项目设计并实现了一个基于MSP430单片机的智能温控系统。系统可以实时显示当前温度&#xff0c;并且可以根据设置的临界值对环境进行加热或降温。主要功能如下&#xff1a; 实时显示当前温度。显示并调整温度临界值&#xff0c;临界值可在20~35摄氏度之间调节。当前…

STM32-呼吸灯仿真

目录 前言: 一.呼吸灯 二.跑马灯 三. 总结 前言: 本篇的主要内容是关于STM32-呼吸灯的仿真,包括呼吸灯,跑马灯的实现与完整代码,欢迎大家的点赞,评论和关注. 接上http://t.csdnimg.cn/mvWR4 既然已经点亮了一盏灯,接下来就可以做更多实验了, 一.呼吸灯 在上一个的基础上…

力扣560. 和为 K 的子数组

Problem: 560. 和为 K 的子数组 文章目录 题目描述思路复杂度Code 题目描述 思路 1.初始化一个哈希表preSum&#xff0c;用于记录前缀和及其出现次数,ans记录和为k的子数组数量、sum_i记录当前前缀和&#xff1b; 2.将前缀和为 0 的情况存入哈希表&#xff0c;表示前缀和为 0 出…

C# 绘图及古诗填字

绘图 绘图的结果如下&#xff1a; 绘图部分主要使用了 Bitmap、Graphics 具体的函数是 MakeMap 入参说明 string bg : 背景图 Rectangle rect &#xff1a;绘图区域 int row_count &#xff1a;行数 int col_count &#xff1a;列数 string fn &#xff1a;保存到的文件 …

前端三大件速成 05 javascript(1)js组成、引入、基本语法

文章目录 一、js组成二、js的引入三、基本语法1、变量2、基本规范3、关键字4、数据类型&#xff08;1&#xff09;基本数据类型&#xff08;2&#xff09;引用数据类型&#xff08;3&#xff09;数据类型转换&#xff08;4&#xff09;typeof运算符 5、运算符6、流程控制&#…

数据结构与算法笔记:基础篇 - 散列表(下):为什么散列表和链表经常会一起使用?

概述 已经学习了这么多章节了&#xff0c;你有没有发现&#xff0c;两种数据结构&#xff0c;散列表和链表&#xff0c;经常会被放在一起使用。你还记得&#xff0c;前面的章节中都有哪些地方讲到散列表和链表的组合使用吗&#xff1f; 在链表那一节&#xff0c;我讲到如何用…

MAVEN:自定义模板Archetype的创建

目录 一、简介 二、具体步骤 三、 vscode通过模板创建项目 四、通过IDEA创建 一、简介 有时候MAVEN自带的模板库并不能满足我们创建项目的需求&#xff0c;为了能够快速创建项目&#xff0c;免去每次复杂的配置&#xff0c;所以我们需要自定义模板库&#xff0c;本次操作基于…

nss刷题(4)

1、[SWPUCTF 2021 新生赛]easyrce <?php error_reporting(0); highlight_file(__FILE__); if(isset($_GET[url])) { eval($_GET[url]); } ?> if(isset($_GET[url])) isset函数用来检测url变量是否存在&#xff1b;$_GET函数获取变量数据 eval($_GET[url]); eval函数用…

数据挖掘--数据预处理

数据清理 缺失值 如果数据集含有分类属性&#xff0c;一种简单的填补缺失值的方法为&#xff0c;将属于同一类的对象的该属性值的均值赋此缺失值&#xff1b;对于离散属性或定性属性&#xff0c;用众数代替均值。更复杂的方法&#xff0c;可以将其转换为分类问题或数值预测问…

Liunx环境下redis主从集群搭建(保姆级教学)02

Redis在linux下的主从集群配置 本次演示使用三个节点实例一个主节点&#xff0c;两个从节点&#xff1a;7000端口&#xff08;主&#xff09;&#xff0c;7001端口&#xff08;从&#xff09;&#xff0c;7002端口&#xff08;从&#xff09;&#xff1b; 主节点负责写数据&a…

[译文] LLM安全:3.网络LLM攻击及提示注入知识普及(PortSwigger)

这是作者新开的一个专栏&#xff0c;主要翻译国外知名安全厂商的技术报告和安全技术&#xff0c;了解它们的前沿技术&#xff0c;学习它们威胁溯源和恶意代码分析的方法&#xff0c;希望对您有所帮助。当然&#xff0c;由于作者英语有限&#xff0c;会借助LLM进行校验和润色&am…

SpringBoot+Vue幼儿园管理系统(前后端分离)

技术栈 JavaSpringBootMavenMyBatisMySQLVueElement-UI 系统角色 教师用户管理员 功能截图

Plotly : 超好用的Python可视化工具

文章目录 安装&#xff1a;开始你的 Plotly 之旅基本折线图&#xff1a;简单却强大的起点带颜色的散点图&#xff1a;数据的多彩世界三维曲面图&#xff1a;探索数据的深度气泡图&#xff1a;让世界看到你的数据小提琴图&#xff1a;数据分布的优雅展现旭日图&#xff1a;分层数…

立创小tips

立创小tips 原理图中 1-修改图纸属性 保存完&#xff0c;绘制原理图的界面就出现了&#xff0c;然后我们鼠标点击原理图的边缘变成红色就可以高边表格的属性了。 2-鼠标右键可以移动整个原理图 3-查看封装 点击任意一个元器件&#xff0c;在右侧就会显示封装属性&#xff…