Hello,

I try to find an annotation for the recvmsg() function, but had only little
success in it. The program below is a simplified version demonstrating my
problems.

The main issue is the non-detected definition of the 'ptr' parameter of
bar() by the foo() function. I hoped that the @define@ clause in line 29
tells that the 'ptr'-members of *all* 'msg->vec' fields will be defined
by foo(), but splint ignores it :(

Are my annotations wrong and/or can they be extended so that the warning
disappear?


When using foo1() by uncommenting line 53 things are fine and the warning
go away.  When using foo1() in line 54 instead of, the warning reappear,
so splint seems to be unable to conclude the definition-state if arrays
are involved. Can I add annotations to help splint here?


The explicit @temp@-storage annotations in line 5 and 12 are another
issue. When not using them, a lot of warnings regarding bad storage
transfer appear. It is not a problem to add fitting
storage-specifications in the example but when using the shipped unix.h
library annotations, the @only@ storage is assumed for 'struct iovec'
and 'struct msghdr'.

IMO this implicit @only@-storage is wrong for the iovec and msghdr
structures and should be fixed in lib/unix.h. Does there exists a way
to change the storage of members at the declaration of variables?



Enrico

----
     1  #include <stdlib.h>
     2
     3  struct Iovec
     4  {
     5      /*@temp@*/
     6      void                *ptr;
     7      size_t              len;
     8  };
     9
    10  struct Msg
    11  {
    12      /*@temp@*/
    13      struct Iovec        *vec;
    14      size_t              len;
    15  };
    16
    17  static void /*@unused@*/
    18  foo1(/*@special@*/struct Iovec *vec)
    19      /*@modifies vec->ptr[]@*/
    20      /*@defines  vec->ptr[]@*/
    21      /*@uses vec@*/
    22  {
    23    memset(vec->ptr, 0, vec->len);
    24  }
    25
    26  static void
    27  foo(/*@special@*/struct Msg *msg)
    28      /*@modifies msg->vec->ptr[]@*/
    29      /*@defines  msg->vec->ptr[]@*/
    30      /*@uses msg->vec, msg@*/
    31  {
    32    size_t                i;
    33    for (i=0; i<msg->len; ++i)
    34      memset(msg->vec[i].ptr, 0, msg->vec[i].len);
    35  }
    36
    37  static void
    38  bar(/*@out@*/void *ptr, size_t len)
    39      /*@modifies *ptr@*/
    40  {
    41    /*@temp@*/struct Iovec        iov[1], vec;
    42    /*@temp@*/struct Msg          msg;
    43
    44    iov[0].ptr = ptr;
    45    iov[0].len = len;
    46    msg.vec    = iov;
    47    msg.len    = 1;
    48
    49    vec.ptr    = ptr;
    50    vec.len    = len;
    51
    52    foo(&msg);
    53      //foo1(&vec);
    54      //foo1(iov);
    55  }
    56
    57  int main()
    58  {
    59    char          buf[1024];
    60    
    61    bar(buf, sizeof buf);
    62    return 0;
    63  }
----

| $ splint gath.c 
| Splint 3.0.1.6 --- 17 Jun 2002
| 
| gath.c: (in function bar)
| gath.c:55:2: Out storage ptr not defined before return
|   An out parameter or global is not defined before control is transferred. (Use
|   -mustdefine to inhibit warning)
| 
| Finished checking --- 1 code warning

Reply via email to