Почему lint не жалуется ни на одну из следующих трех строк в примере кода ниже?
timeout(&a);
timeout(&b);
if (pthread_create(&t1, NULL, timeout, (void*) &a) != 0)
Не всегда ли небезопасно передавать указатель на локальную переменную? И обе переменные являются локальными …
#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;
}
Иоахим
Передача адреса локальной переменной в функцию очень допустима и распространена. Иногда это неверно, да, но создание чего-то, на что жаловался бы пух, вызовет чрезмерное количество шума / ложных срабатываний.
Я не уверен, если вы говорите о PC Lint здесь, но если да, вот возможная причина: передача указателей на локальные переменные в вызываемые вами функции в основном безвредна, если только эта функция не сохраняет указатель для последующего использования, возможно, после вызывающая сторона завершилась, и, следовательно, локальная переменная больше не имеет экземпляров.
Теперь ваш заголовок ввел меня в заблуждение, говоря о ссылках, в то время как в примере используются только указатели и оператор address-of, а pthreads — это AFAIK a библиотека C, поэтому я буду рассматривать только указатели.
Если в PC Lint вы хотите указать, что вызываемая функция, возможно, возьмет указатель и сохранит его копию для возможного последующего использования, вы можете описать это для PC Lint (9.0), используя опцию ‘semantic’, например
//lint -sem(pthread_create,custodial(4))
Это скажет Линт, что pthread_create
«захватит» указатель, указанный в качестве 4-го параметра. В этом случае Lint может генерировать больше полезных сообщений. Быстрая проверка не выявила больше предупреждений. Ваша проблема будет более сложной, так как вам, вероятно, нужно дать timeout
хранение вашего указателя при звонке pthread_create
, чтобы освободить память, выделенную для a
когда вызывается таймаут, но эта сложная семантика в настоящее время не поддерживается PC Lint. Надеюсь, это объяснение в любом случае поможет.