【发布时间】:2020-07-21 10:01:17
【问题描述】:
有没有什么办法,使用静态分析工具(我现在正在使用Codesonar),来检测以下程序中未释放的锁问题(比如未释放的信号量)?(箭头标记的注释部分)
该项目是一个使用循环调度的多任务系统,其中new_request()是一个中断任务随机到来,send_buffer()是另一个周期任务。
在实际情况下,get_buffer() 和send_buffer() 是各种类型的包装器,它们包含许多调用层,直到实际的锁定/解锁过程。所以我不能在静态分析工具的设置中简单地将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);
}
【问题讨论】:
-
你真的需要这个吗?我问是因为,在多年编写多线程应用程序之后,我还没有看到这样一个问题,它不会在测试期间导致明显的循环、锁定、死锁或明显的段错误/AV 灾难也许这只是运气,我应该买彩票:)
-
请注意,我并不是说我没有遇到这些问题,只是说它们很容易找到并修复:)
-
这是一个旧代码,我们最近发现攻击者可以利用这个漏洞,发送恶意修改的错误请求,使send_buffer停止工作。如果可能的话,我想使用静态分析找到所有类似的错误。
-
听起来很可怕。您可能需要修复的不仅仅是锁定:((
标签: c multithreading semaphore static-analysis