1

Why does lint not complain in any of the following three lines in the code sample below?

timeout(&a);
timeout(&b);
if (pthread_create(&t1, NULL, timeout, (void*) &a) != 0)

Isn't it in always considered unsafe to pass on a pointer to a local variable? And both variables are local...

#include <stdio.h>
#include <pthread.h>

static void* timeout(void* c)
{
    int d = *(*((int**)c));
}

static void sendMessage(int* a)
{
    timeout(&a);
    int* b = new int(2);
    timeout(&b);

    pthread_t t1;
    if (pthread_create(&t1, NULL, timeout, (void*) &a) != 0)
    {
        printf("pthread_create() error\n");
    }
}

int main() 
{
    printf("Running..\n");
    int* e = new int(1);
    sendMessage(e);
    delete e;
    return 0;
}

Joachim

4

2 回答 2

1

我不确定您是否在这里谈论 PC Lint,但如果您是,这可能是一个原因:将指向局部变量的指针传递给您调用的函数基本上是无害的,除非该函数保留指针以供以后使用,可能在之后调用者已经结束,因此局部变量不再有实例化。

现在,您的标题通过谈论引用误导了我,而示例仅使用指针和地址运算符,而 pthreads 是 AFAIK 一个 C 库,所以我只会考虑指针。

如果在 PC Lint 中您想指示调用的函数可能会获取指针并保留其副本以供以后使用,您可以使用 'semantic' 选项向 PC Lint (9.0) 描述这一点,例如

//lint -sem(pthread_create,custodial(4))

这将告诉 Lintpthread_create将“保管”作为第四个参数提供的指针。在这种情况下,Lint 可以生成更多有用的消息。快速检查没有发现更多警告。您的问题会更复杂,因为您可能需要timeout在调用时保管指针pthread_create,以释放在调用超时时分配的内存a,但 PC Lint 目前不支持这种复杂的语义。我希望这个解释无论如何都会有所帮助。

于 2012-11-28T19:11:59.083 回答
1

将局部变量的地址传递给函数是非常有效和常见的。有时它是不正确的,是的,但是让它成为 lint 会抱怨的东西会产生过多的噪音/误报。

于 2012-11-23T16:52:17.087 回答