[splint-discuss] Splint usage help
Brian Quinlan
brian.quinlan at iolfree.ie
Sat Apr 18 11:59:16 PDT 2009
On Sat, 2009-04-18 at 06:38 -0700, Marcus Martin wrote:
> <Please ignore the first message, this one is in plain text.>
>
>
> I
> am a new splint user and am having some difficutly with the
> annotations. I read the documentation and looked at the examples and
> still have some trouble. Can someone please help me get started?
>
> I have the source code line:
> const char *subCmds[] = { "-file", "-stream", NULL };
>
Hi Marcus,
Try the following:
typedef /*@null@*/ const char *StringListElement;
StringListElement subCmds[] = { "-file", "-stream", NULL };
The basic problem is that splint (reasonably) assumes const char* is
non-null. In this case, you need to change this assumption by using the
the /*@null@*/ annotation. Adding it directly to your line doesn't work.
I think this is because this tells splint the array, rather than each
array element, can be null. There might be a way of achieving the same
effect without the two line hack, but I don't see it myself.
Bye,
Brian
> This
> array needs to have the last element be NULL so when used a parameter
> in a method, the method knows when to stop reading the array. Splint
> produces the following errors.
>
> test.c:94:68: Index of possibly null pointer subCmds: subCmds
> A possibly null pointer is dereferenced. Value is either the result of a
> function which may return null (in which case, code should check it is not
> null), or a global, parameter or structure field declared with the null
> qualifier. (Use -nullderef to inhibit warning)
> test.c:94:27: Storage subCmds may become null
> test.c:94:61: Local subCmds[2] initialized to null value: subCmds[2] = NULL
> A reference with no null annotation is assigned or initialized to NULL. Use
> /*@null@*/ to declare the reference as a possibly null pointer. (Use
> -nullassign to inhibit warning)
>
> After reading the warnings I tried changing the source line in the following ways, none of which worked for me.
>
> /*@-nullderef@*/ const char *subCmds[] = { "-file", "-stream", NULL }; /*@=nullderef@*/
> /*@-nullassign@*/ const char *subCmds[] = { "-file", "-stream", NULL }; /*@=nullassign@*/
> const char *subCmds[] = { "-file", "-stream", /*@null@*/ NULL };
>
> The
> second problem I encountered is that splint wants me to annotate the
> header files of exeternal packages I call to indicate out parameters
> and parameters that can be NULL. Since I don't own that source code,I
> really don't want to change it. How do I indicate to splint where I
> invoked the method that my parameters are correct and the method is
> used correctly.
>
> The third issue is that I am creating a shared
> library that implements the interface. At no place in my code base
> will I call these public interface methods. How can I tell splint that
> these methods are exported and not called directly, but that is okay.
>
> Can
> someone tell me what I am doing wrong? Once I understand these three
> problems, I should be able to fix the rest of my module.
>
> Marcus
>
>
>
> _______________________________________________
> splint-discuss mailing list
> splint-discuss at mail.cs.virginia.edu
> http://www.cs.virginia.edu/mailman/listinfo/splint-discuss
More information about the splint-discuss
mailing list