File: observer.c

package info (click to toggle)
splint 3.1.2.dfsg1-4
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 14,732 kB
  • ctags: 16,317
  • sloc: ansic: 150,320; yacc: 3,463; sh: 3,003; makefile: 2,153; lex: 412
file content (51 lines) | stat: -rw-r--r-- 919 bytes parent folder | download | duplicates (8)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
typedef struct 
{
  /*@only@*/ char *name;
  int   val;
} *stx;

/*@only@*/ char *stx_name (stx x)
{
  return (x->name); /* 1. Function returns reference to parameter x: (x->name)
		    ** [2]. Return value exposes rep of stx: (x->name)
		    ** 3. Released storage x->name reachable from parameter 
		    */
}

/*@observer@*/ char *stx_observeName (stx x)
{
  return (x->name); 
}

/*@exposed@*/ char *stx_exposeName (stx x)
{
  return (x->name); /* okay */
}

char *f (stx x)
{
  char *s;

  s = stx_name (x);
  free (s);  /* okay */

  s = stx_observeName (x);
  *s = 'x'; /* 4. Modification of observer */
  free (s); /* 5. Pass observer as only */

  s = stx_exposeName (x);
  *s = 'x'; /* okay */
  free (s); /* 6. Pass exposed as only */

  s = stx_observeName (x);
  return s; /* 7. Observer storage s returned without qualification: s
	    ** 8. Dependent storage s returned as unqualified: s
	    */
}