如何使用静态分析工具检测多任务C项目中未释放的锁?

How to detect unreleased lock in multi-task C project using static analysis tools?

有没有什么办法,利用静态分析工具(我现在用的是Codesonar),来检测下面程序中的未释放锁问题(比如未释放信号量)?(箭头所指的注释部分)

该项目是一个使用Round-robin调度的多任务系统,其中new_request()是一个随机出现的中断任务,send_buffer()是另一个周期任务。

在实际情况下,get_buffer()send_buffer()是各种类型的包装器,在实际lock/unlock过程之前包含许多调用层。所以我不能简单地在静态分析工具的设置中将 get_buffer() 指定为 lock function

int bufferSize = 0;     // say max size is 5

// random task
void new_request()
{
    int bufferNo = get_buffer();    // wrapper

    if (bufferNo == -1)
    {
        return;    // buffer is full
    }   

    if (check_something() == OK)
    {
        add_to_sendlist(bufferNo);  // for asynchronous process of send_buffer()
    }
    else    // bad request
    {
        // ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
        // There should be clear_buffer placed here
        // but forgotten. Eventually the buffer will be
        // full and won't be cleared since 5th bad request comes.
        // ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑

        do_nothing();
        // clear_buffer(bufferNo);
    }
}

int get_buffer()
{
    if(bufferSize < 5)
    {
        bufferSize++;
        return bufferSize;
    }
    else
    {
        wait_until_empty(); // wait until someone is sent by send_buffer()
        return -1;
    }

}

// clear specifiled one in buffer
void clear_buffer(int bufferNo) 
{
    delete(bufferNo)
    bufferSize--;
    
}
// period task
void send_buffer()
{
    int sent = send_1st_stuff_in_list();
    clear_buffer(sent);
}

yoyozi - 公平披露:我是 GrammaTech 的一名工程师,从事 CodeSonar。

首先是一些一般性的事情。手册的相关部分在页面上:codesonar/doc/html/C_Module/LibraryModels/ConcurrencyModelsLocks.html。尤其是解决锁操作识别问题的页面底部。

根据您的评论,我认为您已经阅读了这篇文章,因为您在配置设置中解决了设置名称的问题。

那么问题是你有多少种不同的包装纸?如果只有几个,那么配置文件中的设置是可行的。如果有很多,那会很乏味。如果有很多,那几乎是不可能的。

因此,了解一些关于您拥有多少包装器集的估计值会有所帮助。

即使考虑了包装器,死锁和竞争检测器也可能不是您解决问题所需要的。

如果我对你的问题的理解正确,你的队列 space 是有限的,而且不小心格式错误的项目没有从队列中清除,所以队列变满了,所有处理都停止了.虽然您可能在此实现中涉及多个线程,但问题本身在基本串行设置中仍然是一个问题。

解决此类问题的最佳方法是尝试制作一个更简单的示例来显示相同​​的核心问题。如果您可以通过与 GrammaTech 共享的方式执行此操作,我们可以与您一起调整设置,或者可能为分析提供提示,以便它可以找到此问题。

如果您想更详细地讨论这个问题,并防止 public 泄露您的代码,请通过 support_at_grammatech_dot_com 联系我们,其中 应根据需要进行替换,以构成格式正确的电子邮件地址。