Я пытаюсь проверить программу на C с помощью Splint (в строгом режиме). Я добавил к исходному коду семантические комментарии, чтобы помочь Splint понять мою программу. Все было хорошо, но я никак не могу избавиться от предупреждения:
Заявление не имеет никакого эффекта (возможна незамеченная модификация через вызов неограниченной функции my_function_pointer).
Заявление не имеет видимого эффекта --- никакие значения не изменяются. Он может что-то изменить через вызов неограниченной функции. (Используйте -noeffectuncon, чтобы запретить предупреждение)
Это вызвано вызовом функции через указатель функции. Я предпочитаю не использовать флаг no-effect-uncon
, а написать еще несколько аннотаций, чтобы исправить это. Итак, я украсил свой typedef
соответствующим предложением @modifies
, но Splint, кажется, полностью его игнорирует. Проблема может быть сведена к:
#include <stdio.h>
static void foo(int foobar)
/*@globals fileSystem@*/
/*@modifies fileSystem@*/
{
printf("foo: %d\n", foobar);
}
typedef void (*my_function_pointer_type)(int)
/*@globals fileSystem@*/
/*@modifies fileSystem@*/;
int main(/*@unused@*/ int argc, /*@unused@*/ char * argv[])
/*@globals fileSystem@*/
/*@modifies fileSystem@*/
{
my_function_pointer_type my_function_pointer = foo;
int foobar = 123;
printf("main: %d\n", foobar);
/* No warning */
/* foo(foobar); */
/* Warning: Statement has no effect */
my_function_pointer(foobar);
return(EXIT_SUCCESS);
}
Я прочитал руководство, но там не так много информации об указателях на функции и их семантических аннотациях. , так что не знаю, то ли я что-то не так делаю, то ли это какой-то баг (кстати, здесь его еще нет: http://www.splint.org/bugs.html).
Кому-нибудь удалось успешно проверить такую программу с помощью Splint в строгом режиме? Пожалуйста, помогите мне найти способ осчастливить Сплинта :)
Заранее спасибо.
Обновление №1: splint-3.1.2 (версия для Windows) выдает предупреждение, а splint-3.1.1 (версия для Linux x86) не жалуется на это.
Обновление №2: Splint не волнует, являются ли назначение и вызов короткими или длинными:
/* assignment (short way) */
my_function_pointer_type my_function_pointer = foo;
/* assignment (long way) */
my_function_pointer_type my_function_pointer = &foo;
...
/* call (short way) */
my_function_pointer(foobar);
/* call (long way) */
(*my_function_pointer)(foobar);
Обновление №3: я не заинтересован в запрете предупреждения. Это легко:
/*@-noeffectuncon@*/
my_function_pointer(foobar);
/*@=noeffectuncon@*/
Я ищу правильный способ выразить:
"этот указатель на функцию указывает на функцию, которая
@modifies
содержит, поэтому она имеет побочные эффекты"