☰
  • 首页
  • 规则分类
  • 项目介绍
search
•••

避免异步终止线程

16.5 ID_asynchronousTermination
目录 › next › previous

资源的使用情况在异步过程中是难以掌控的,异步终止线程往往会导致泄漏或死锁等严重问题。

示例:

void* foo(void* param) {
    pthread_setcanceltype(
        PTHREAD_CANCEL_ASYNCHRONOUS, ....  // Non-compliant
    );
    ....                                   // Allocate or lock
}

void bar() {
    pthread_t thd;
    pthread_create(&thd, NULL, foo, NULL);
    ....
    pthread_cancel(thd);   // Non-compliant, leak or deadlock
}

以 pthread 线程库为例,foo 和 bar 是两个相关的异步过程,foo 通过 PTHREAD_CANCEL_ASYNCHRONOUS 指定其线程可以随时被终止,bar 调用 pthread_cancel 终止 foo 线程,在一个过程中暴力终止另一个过程是非常危险的,会使锁、信号量或动态分配的资源无法释放。

PTHREAD_CANCEL_ASYNCHRONOUS 等选项、TerminateThread 等 Windows API,以及具有相同功能的选项或 API 均不应使用,应使线程主动执行清理并正常结束执行。

相关

ID_resourceLeak ID_deadlock ID_illLifetime

参考

SEI CERT POS47-C
Copyright©2024 360 Security Technology Inc., Licensed under the Apache-2.0 license.