2022-7-29 程序自动修复方法在状态机修复里的应用探讨

Abstract

探索了程序自动修复方法在状态机修复里的应用,尝试借鉴,解决生成修复措施的核心问题。
分析了此类方法在普通程序中可行,却在TAP规则状态机里不可行的原因。
针对该原因,提出了一种从状态机层面、Solution Space角度思考的方法。
同时从二分查找里找到一种减少状态空间的方法。





一、缺陷定位

1.1 普通程序的缺陷定位

利用CEX修复网络缺陷,程序的任意地方、predicate都有可能是可疑的,

-------------
  | |-----------
  | |-----------
  |---------------

因为不好确定是哪个predicate导致的错误

1.2 状态机的缺陷定位

AutoTap默认了在前一状态triggers the bug,即缺陷在前一状态
状态机不同的是suspicious statements先对固定,数量不大而不会生成大量操作





二、补丁生成

一篇程序自动修复综述+两篇基于人工模板修复。
Solution Space对程序自动修复的影响

2.1 普通程序中的solution space

solution语料库 组成 patch,patch组成solution space

solution space中包括缺陷的修复方法。S = C ∪I ∪X (correct patches、 不可信 ones、 可信 but incorrect ones)其来源于某部分原有的或扩展的程序,原有或扩展的程序中可能出现错误代码的正确处理。

基于启发式的方法通过利用历史代码、本程序相似代码或变异代码得到语料,通过组合语料尽可能推理整个solution space,以此找到修复方法。利用CEX修复网络缺陷应该属于这类。

基于人工模板的方法,通过静态分析data and control dependences等详细语料信息,使得修复方法更adequate。


2.2 TAP规则的状态机中的solution space

solution space 来源于当前构建的状态机,状态机中如果包含所有状态,那么Solution Space有解,如羊狼过河。
这和之前利用历史代码、本程序相似代码的思想类似。

!( ((goat = cabbage | goat = wolf)->man = goat) U (man & cabbage & goat & wolf) )

如果状态机不足,这种利用相似代码的思想就会无法生成解决方法。因为很可能是没出现过的状态。 例子如下:

反例的思想,
[state] should [always] be active  G(state),比如冰箱要一直打开
返回一条off的
[state] should [never] be active ¬F(state)
返回一条一直on的,但是可能是正常的,且是在当前TAP语境下的,
如果不反悔,说明当前状态机没有,即有问题
S =  C ∪I ∪X  I就是正常的路径

一种思路是完善状态机。另一种思路就是交给外部处理如AutoTap





三、细化Solution Space

3.1 扩展

by including more correct patches and less incorrect ones from the entire solution space S = L × O(整个状态机)

3.1.1 加入由property的生成的初始规则

3.1.2 light > 500改为变量light > config_value理论上存在一条路径为全局最终解

light > 500改为变量light > config_value理论上存在一条路径为全局最终解。因为修改后的被应用到下一次状态中了,有迭代的感觉,但反例不一定是该条路径,导致生成的只适用于该反例

而且把建模加入下一轮,也保证了全局性。

3.1.3 基于人工修复模板加入每轮建模,也保证了全局性。相当于验证patch的正确性

修复方法会 introduce new bugs

引起状态机状态变化的是因为trigger触发的action和自然环境的变化。可以根据缺陷的root cause事先生成一些模板
基于人工修复模板:从现有规则中根据action是否存在潜在冲突,提取trigger中的语义并组合为模板
问题:单条TAP规则 并且 a single action to redirect (Action Breaking是两条)
physical channel建模时也会考虑,所以一举两得

利用变异。朝着预定方向变化,fitness function,扩展Solution Space,同时有个

3.2 Reduce Solution Space

一篇符号执行综述+AFL源码分析的变异部分文章。通过符号执行reduce solution space,二分查找。

the solution space L×O is thus reduced to a subset L × O= C ∪ I ∪ X ,

二分查找的思路: 先取中间,根据结果去哪一半,然后再取中间。数也是有序的,最合适的配置值就是我们要搜索的,其特点是false和true





四、前后模型对比

还是两个模型,只是反例模型变为了扩展模型
仍要用CEX,但是CEX和原来一样就和AutoTap没差别。CEX里有修复措施,人为去比去确认





问题

问题:创新点?raining的怎么改,目前偏向于修改而不是新增
问题:多action

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 要修复S7-300程序卡,首先需要检查一些常见问题。首先,确认程序卡已正确插入插槽。如果插入不正确,可以尝试重新插入程序卡并确保插入的角度和方向正确。其次,检查程序卡是否损坏或脏污。如果程序卡损坏,可能需要更换新的程序卡。如果程序卡脏污,可以使用软刷或酒精棉清洁程序卡上的金属接点。同时,确保程序卡与插槽之间没有杂物或灰尘,这可能会导致插接不良。 另外,对于一些与程序卡相关的故障,可以尝试重新初始化程序卡。首先,在STEP 7软件中选择对应的CPU进行加载。然后,打开硬件配置,并选择“Options”菜单下的“Access/Password Protection”选项。在“Access/Password Protection”对话框中,选择“Reset to Default”将程序恢复为出厂设置。 此外,还需检查程序卡的固件版本是否与CPU兼容。如果程序卡固件版本过旧或过新,可能会导致与CPU不兼容,需要升级或降级程序卡固件。 最后,如果上述方法都没有解决问题,可以尝试使用备份的程序恢复程序卡。首先,在STEP 7软件中选择下载菜单下的“Memory Card”选项。然后,加载备份的程序并下载到程序卡上。 总之,修复S7-300程序卡可以通过插入正确、清洁、重新初始化、固件升级/降级和使用备份程序等。如果以上方法都没有解决问题,可能需要联系专业的技术人员或Siemens官方技术支持寻求更进一步的帮助。 ### 回答2: 修复S7-300程序卡的方法有以下几点: 1. 检查硬件连接:检查S7-300 PLC与电源、输入输出模块等硬件的连接是否正常,是否松动。如果连接不稳定或松动,重新插拔连接线,确保连接牢固可靠。 2. 检查电源供应:检查电源供应是否正常。若电源电压不稳定或不足,可能导致程序卡读取错误。可以使用电压表测量电源电压,如有问题,及时更换电源。 3. 检查程序卡插槽:检查程序卡是否正确插入到S7-300 PLC的插槽中。有时候程序卡可能松动或插入不到位,导致程序无法读取。可以将程序卡拔出然后再插入到插槽中,确保插入到位,并锁紧螺丝。 4. 检查程序状态灯:程序卡上有多个状态灯,用于指示程序卡的正常运行状态。如果状态灯不亮或闪烁异常,可能表示程序卡故障。可以尝试重新插拔程序卡,或者更换一张新的程序卡。 5. 软件恢复:如果以上方法均无效,可以尝试使用STEP 7编程软件进行备份和恢复程序。首先,将S7-300 PLC与编程电脑通过编程线连接起来,然后在STEP 7软件中选择相应的PLC型号,进行备份和恢复程序操作。注意备份程序时要选择全备份,确保备份完整性。 以上是修复S7-300程序卡的一些常见方法,希望对您有所帮助。如果问题仍未解决,建议联系专业的维修人员进行进一步检修和维修。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

q1uTruth

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值