0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

集成错误检测威廉希尔官方网站 以发现嵌入式C软件中的更多错误

星星科技指导员 来源:嵌入式计算设计 作者:Parasoft SA ,Mirosł 2022-06-19 09:49 次阅读

诸如基于模式的静态代码分析、运行时内存监控、单元测试和流分析等自动化威廉希尔官方网站 可以一起用于查找嵌入式 C 应用程序中的错误。以下讨论将使用 Parasoft C/C++test 演示这些威廉希尔官方网站 ,Parasoft C/C++test 是一种集成解决方案,用于自动化广泛的最佳实践,以提高 C 和 C++ 软件开发团队的生产力和软件质量。

示例传感器应用

可以在 ARM Cortex-M3 板上运行的简单传感器应用程序的上下文中探索推荐的错误发现策略。应用程序已创建并上传到开发板,但在运行时,它不会在 LCD 屏幕上呈现预期的输出。

它不起作用,原因尚不清楚。在目标板上进行调试既费时又乏味,因为需要手动分析调试器结果以尝试确定真正的问题。或者,可以应用某些工具或威廉希尔官方网站 来自动查明错误。

此时,两个选项是使用调试器调试应用程序或应用自动化测试策略从代码中剥离错误。如果应用自动化威廉希尔官方网站 后应用程序仍然无法工作,调试器可以作为最后的手段。

基于模式的静态代码分析

应用了基于模式的静态分析,而不是调试,它快速、易于使用并且几乎可以应用于每次代码 更改。通过执行静态分析确定了一个问题(参见图 1)。

图 1:静态代码分析识别 MISRA 编码标准违规。

pYYBAGKugNCAKz00AAKeNT6_DJg677.png

这违反了 MISRA 规则,即在布尔表达式中使用赋值运算符可能会有风险。目的不是使用赋值运算符,而是使用比较运算符。所以这个问题得到解决,程序重新运行。

由于一些输出显示在 LCD 上,因此有所改进。但是,应用程序因访问冲突而崩溃。再一次,有一个选择:使用调试器或继续应用自动错误检测威廉希尔官方网站 。鉴于自动错误检测在发现此类内存损坏方面非常有效,因此执行运行时内存监控是最佳选择。

整个应用程序的运行时内存监控

可以通过应用适合在目标板上运行的轻量级仪器来执行运行时内存监控。上传并运行检测的应用程序并下载结果后,会报告错误(参见图 2)。

图 2:运行时内存监控报告读取超出范围的数组。

poYBAGKugOyASgfwAALXAj_X3z4239.png

这表明在第 48 行读取了一个超出范围的数组。显然,msgIndex变量的值一定超出了数组的范围。向上堆栈跟踪显示,这个具有超出范围值的打印消息是由于在调用函数printMessage()之前为其设置了不正确的条件而导致的。这可以通过放松if语句中的值范围控制并去掉不必要的条件(value 《= 20)来解决。

void handleSensorValue(int value)

{

initialize();

int index = -1;

if (value 》= 0 && value 《= 10) {

index = VALUE_LOW;

} else if ((value 》 10) && (value 《= 20)) {

index = VALUE_HIGH;

}

printMessage(index, value);

}

现在,当重新运行应用程序时,不会报告内存错误。应用程序上传到板后,它似乎按预期工作。然而,一些担忧仍然存在。

在执行的代码路径中发现了一个内存覆盖实例,但这是否意味着未执行的代码中没有内存覆盖?覆盖分析表明,有些代码根本没有被执行。reportSensorFailure() 函数没有被覆盖,并且调用reportSensorFailure的mainLoop函数内部的一个分支根本没有被执行(再次参见图 2)。测试此代码的一种方法是创建一个单元测试(用于mainLoop函数)和一个用户存根(用于readSensor函数),以interwetten与威廉的赔率体系 在功能测试期间难以重现的条件。

带有运行时内存监控的单元测试

创建一个测试用例骨架,然后用测试代码填充。 此外,为readSensor函数添加了一个存根以模拟读取错误。运行测试用例——只执行这个以前未测试的功能——启用运行时内存监控。结果显示该函数现在已被覆盖,但报告了新的错误(参见图 3)。

图 3:启用运行时内存监控的单元测试会暴露内存错误。

poYBAGKugPiANVkRAALMdClGdXM371.png

测试用例发现了更多与内存相关的错误。调用失败处理程序时,内存初始化(空指针)存在明显问题。进一步分析表明,reportSensorValue()中混合了调用顺序,因此finalize()在printMessage()被调用之前被调用,但finalize()实际上释放了printMessage()使用的内存。

void finalize()

{

if (messages) {

free(messages[0]);

free(messages[1]);

free(messages[2]);

}

free(messages);

}

void printMessage(int msgIndex, int value)

{

const char* msg = messages[msgIndex];

printf(“Value: %d, State: %s\n”, value, msg);

fflush(stdout);

}

void reportSensorFailure()

{

finalize();

printMessage(ERROR_MSG, 0);

}

这个顺序是固定的,测试用例会重新运行一次。

这解决了报告的错误之一。下一步是解决报告的第二个问题:打印消息中的 AccessViolationException。这是因为这些表消息未初始化。为了解决这个问题,在打印消息之前调用initialize()函数。修复后的功能如下:

void reportSensorFailure()

{

initialize();

printMessage(ERROR, 0);

finalize();

}

重新运行测试时,只报告一个任务:一个无效的单元测试用例,这并不是真正的错误。必须验证结果才能将此测试转换为回归测试(参见图 4)。

图 4:必须为回归测试配置测试。

poYBAGKugQmAPZF6AALbv8XkLNU703.png

接下来,再次运行整个应用程序。覆盖率分析显示几乎整个应用程序都被覆盖了,结果表明没有出现内存错误问题。

即使运行了整个应用程序并为未覆盖的函数创建了单元测试,但仍有一些路径未被覆盖。可以继续使用单元测试创建,但需要一些时间才能覆盖应用程序中的所有路径。相反,可以使用流量分析来模拟这些路径。

流量分析

运行流分析以模拟通过系统的不同路径,并检查这些路径中是否存在潜在问题。报告了几个问题(参见图 5)。

图 5:流分析发现路径中的几个问题。

pYYBAGKugRKAFdLPAAKJvZLif3o566.png

有一条潜在的路径——一个未被覆盖的路径——在finalize()函数中可以有一个双重释放。reportSensorValue()函数调用finalize(),然后finalize ()调用free()。此外,在mainLoop()中再次调用finalize () 。这可以通过使finalize()更智能来解决:

void finalize()

{

if (messages) {

free(messages[0]);

free(messages[1]);

free(messages[2]);

free(messages);

messages = 0;

}

}

然后再运行一次流量分析。仅报告了两个问题(参见图 6)。

图 6:流量分析检测到两个剩余问题。

poYBAGKugRyAeJDWAAKcpBYS3ko035.png

此处可能正在访问索引为-1的表。这是因为积分索引最初设置为 -1,并且在调用printMessage()之前,可能存在一条通过if语句未将此积分设置为正确值的路径。运行时分析并没有导致这条路径,并且这条路径可能永远不会在现实生活中被采用。与实际运行时内存监控相比,这是流分析的主要弱点。流分析显示潜在路径,不一定是在实际应用程序执行期间将采用的路径。通过删除不必要的条件(value 》= 0)可以轻松修复此潜在错误。

void handleSensorValue(int value)

{

initialize();

int index = -1;

if (value 《= 10) {

index = VALUE_LOW;

} else {

index = VALUE_HIGH;

}

printMessage(index, value);

}

报告的最终错误以类似的方式修复。现在,重新运行流分析时,不会报告任何问题。

回归测试

为确保一切正常,重新运行整个分析。首先,应用程序在运行时内存监控下运行,一切似乎都很好。然后使用内存监控运行单元测试并报告一个任务(参见图 7)。

图 7:单元测试发现回归失败。

pYYBAGKugSqAMO23AAJ8hf7fSs4642.png

单元测试检测到reportSensorFailure()函数的行为发生了变化。这是由finalize()中的修改引起的,这是为了纠正先前报告的问题之一而进行的更改。此任务引起对更改的注意,并指示必须审查测试用例。然后要么更正代码,要么更新测试用例,以表明这个新行为实际上是预期的行为。看了下代码,很明显后者为真,并且更新了断言的条件。

void sensor_tests_test_reportSensorFailure()

{

{

messages = 0 ;

}

{

reportSensorFailure();

CPPTEST_ASSERT(0 == ( messages ));

}

}

作为最后的健全性检查,整个应用程序独立运行,在集成开发环境中构建它,无需任何运行时内存监控。结果证实它按预期工作。

补充工具

所有应用的测试方法——基于模式的静态代码分析、内存分析、单元测试、流分析和回归测试——不相互竞争,而是相互补充。一起使用,它们提供了一个非常强大的工具,可以为嵌入式 C 软件提供无与伦比的自动错误检测水平。

作者:Parasoft SA ,Mirosław Zieli nski

审核编辑:郭婷

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 传感器
    +关注

    关注

    2551

    文章

    51192

    浏览量

    754393
  • 嵌入式
    +关注

    关注

    5086

    文章

    19141

    浏览量

    305971
  • C++
    C++
    +关注

    关注

    22

    文章

    2110

    浏览量

    73695
收藏 人收藏

    评论

    相关推荐

    RTOS错误检查机制

    嵌入式应用,有可能发生各种各样的错误,系统必须能够检测到这些错误并作出适当的响应。RTOS通常内置了一些
    的头像 发表于 01-03 14:44 237次阅读

    嵌入式系统开发的测试方法 嵌入式系统开发与AI结合应用

    嵌入式系统开发的测试方法 嵌入式系统开发是一个复杂的过程,涉及到硬件和软件的紧密结合。测试是确保系统可靠性和性能的关键步骤。以下是一些常用的测试方法: 单元测试 : 单元测试是针对
    的头像 发表于 12-09 10:22 391次阅读

    SQL错误代码及解决方案

    中存在语法错误,如拼写错误、缺少必要的关键字等。 解决方案 : 仔细检查SQL语句,确保语法正确。 使用SQL编辑工具或集成开发环境(IDE)的语法高亮和自动完成功能来帮助检测语法
    的头像 发表于 11-19 10:21 2015次阅读

    什么是嵌入式?一文读懂嵌入式主板

    在现代科技浪潮嵌入式威廉希尔官方网站 已成为支撑各种智能设备和系统运行的核心力量。那么,究竟什么是嵌入式嵌入式系统,顾名思义,是将计算机的硬件和
    的头像 发表于 10-16 10:14 1141次阅读

    SRAM错误检测

    电子发烧友网站提供《SRAM错误检测.pdf》资料免费下载
    发表于 09-20 11:15 0次下载
    SRAM<b class='flag-5'>中</b>的<b class='flag-5'>错误</b><b class='flag-5'>检测</b>

    嵌入式系统的未来趋势有哪些?

    (ML)威廉希尔官方网站 的快速发展,嵌入式系统将更多地整合这些先进威廉希尔官方网站 支持智能决策和自动化。在设备上直接运行AI和ML模型,进行图像识别、自然语言处
    发表于 09-12 15:42

    飞凌嵌入式威廉希尔官方网站 创新日(深圳站)精彩回顾

    的产品线有了更全面的了解;飞凌嵌入式项目总监王总分享的嵌入式行业案例和威廉希尔官方网站 应用,让与会者深刻感受到了嵌入式威廉希尔官方网站 在各行各业
    发表于 08-28 09:06

    嵌入式C编程常用的异常错误处理

    嵌入式C编程,异常错误处理是确保系统稳定性和可靠性的重要部分。以下是一些常见的异常错误处理方法及其详细说明和示例: 1. 断言 (Ass
    发表于 08-06 14:32

    嵌入式软件开发与AI整合

    嵌入式软件开发与AI整合是当前威廉希尔官方网站 发展的重要趋势之一。随着人工智能威廉希尔官方网站 的快速发展,嵌入式系统越来越多地
    的头像 发表于 07-31 09:25 733次阅读
    <b class='flag-5'>嵌入式</b><b class='flag-5'>软件</b>开发与AI整合

    嵌入式系统怎么学?

    系统设计与调试:需要掌握嵌入式系统的设计方法和调试威廉希尔官方网站 ,包括硬件设计、软件设计、电路调试等,确保系统的稳定性和可靠性。 随着威廉希尔官方网站 的不断进
    发表于 07-02 10:10

    嵌入式软件工程师和硬件工程师的区别?

    、机器人等。 定义和工作职责 嵌入式软件工程师的主要职责包括但不限于:设计、开发、测试和调试嵌入式软件应用程序,满足特定硬件和
    发表于 05-16 11:00

    嵌入式fpga是什么意思

    嵌入式FPGA是指将FPGA威廉希尔官方网站 集成嵌入式系统的一种解决方案。嵌入式系统是一种为特定应用而设
    的头像 发表于 03-15 14:29 1282次阅读

    嵌入式工程师需要掌握哪些威廉希尔官方网站 ?

    一些必要的威廉希尔官方网站 能力是至关重要的。在本篇,我们将讨论入行嵌入式所必须的威廉希尔官方网站 能力。 1.C/C+
    发表于 03-04 16:38

    聊一聊嵌入式C语言

    作为一名嵌入式软件开发者,熟练掌握嵌入式C语言对我的日常工作至关重要。
    的头像 发表于 01-22 09:28 554次阅读

    Tessy—嵌入式软件单元测试/集成测试工具

    Tessy源自戴姆勒—奔驰公司的软件威廉希尔官方网站 实验室,由德国Hitex公司负责销售及威廉希尔官方网站 的支持服务,是一款专门针对嵌入式软件进行单元/集成测试的工
    的头像 发表于 01-15 14:39 857次阅读
    Tessy—<b class='flag-5'>嵌入式</b><b class='flag-5'>软件</b>单元测试/<b class='flag-5'>集成</b>测试工具