2
0
mirror of https://github.com/openvswitch/ovs synced 2025-09-03 07:45:30 +00:00

Make the source tree sparse clean.

With this commit, the tree compiles clean with sparse commit 87f4a7fda3d
"Teach 'already_tokenized()' to use the stream name hash table" with patch
"evaluate: Allow sizeof(_Bool) to succeed" available at
http://permalink.gmane.org/gmane.comp.parsers.sparse/2461 applied, as long
as the "include/sparse" directory is included for use by sparse (only),
e.g.:
     make CC="CHECK='sparse -I../include/sparse' cgcc"
This commit is contained in:
Ben Pfaff
2011-05-06 12:59:51 -07:00
parent c4cac9abf2
commit 6506f45c08
16 changed files with 616 additions and 7 deletions

View File

@@ -1,3 +1,4 @@
include include/linux/automake.mk
include include/openflow/automake.mk
include include/openvswitch/automake.mk
include include/sparse/automake.mk

View File

@@ -0,0 +1,21 @@
/*
* Copyright (c) 2011 Nicira Networks.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at:
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef __CHECKER__
#error "Use this header only with sparse. It is not a correct implementation."
#endif
#include <netinet/in.h>

22
include/sparse/assert.h Normal file
View File

@@ -0,0 +1,22 @@
/*
* Copyright (c) 2011 Nicira Networks.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at:
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef __CHECKER__
#error "Use this header only with sparse. It is not a correct implementation."
#endif
extern void __ovs_assert(_Bool);
#define assert(EXPRESSION) __ovs_assert(EXPRESSION)

View File

@@ -0,0 +1,8 @@
noinst_HEADERS += \
include/sparse/arpa/inet.h \
include/sparse/assert.h \
include/sparse/math.h \
include/sparse/netinet/in.h \
include/sparse/netinet/ip6.h \
include/sparse/sys/socket.h \
include/sparse/sys/wait.h

203
include/sparse/math.h Normal file
View File

@@ -0,0 +1,203 @@
/*
* Copyright (c) 2011 Nicira Networks.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at:
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef __CHECKER__
#error "Use this header only with sparse. It is not a correct implementation."
#endif
#ifndef __SYS_MATH_SPARSE
#define __SYS_MATH_SPARSE 1
double acos(double);
float acosf(float);
double acosh(double);
float acoshf(float);
long double acoshl(long double);
long double acosl(long double);
double asin(double);
float asinf(float);
double asinh(double);
float asinhf(float);
long double asinhl(long double);
long double asinl(long double);
double atan(double);
double atan2(double, double);
float atan2f(float, float);
long double atan2l(long double, long double);
float atanf(float);
double atanh(double);
float atanhf(float);
long double atanhl(long double);
long double atanl(long double);
double cbrt(double);
float cbrtf(float);
long double cbrtl(long double);
double ceil(double);
float ceilf(float);
long double ceill(long double);
double copysign(double, double);
float copysignf(float, float);
long double copysignl(long double, long double);
double cos(double);
float cosf(float);
double cosh(double);
float coshf(float);
long double coshl(long double);
long double cosl(long double);
double erf(double);
double erfc(double);
float erfcf(float);
long double erfcl(long double);
float erff(float);
long double erfl(long double);
double exp(double);
double exp2(double);
float exp2f(float);
long double exp2l(long double);
float expf(float);
long double expl(long double);
double expm1(double);
float expm1f(float);
long double expm1l(long double);
double fabs(double);
float fabsf(float);
long double fabsl(long double);
double fdim(double, double);
float fdimf(float, float);
long double fdiml(long double, long double);
double floor(double);
float floorf(float);
long double floorl(long double);
double fma(double, double, double);
float fmaf(float, float, float);
long double fmal(long double, long double, long double);
double fmax(double, double);
float fmaxf(float, float);
long double fmaxl(long double, long double);
double fmin(double, double);
float fminf(float, float);
long double fminl(long double, long double);
double fmod(double, double);
float fmodf(float, float);
long double fmodl(long double, long double);
double frexp(double, int *);
float frexpf(float value, int *);
long double frexpl(long double value, int *);
double hypot(double, double);
float hypotf(float, float);
long double hypotl(long double, long double);
int ilogb(double);
int ilogbf(float);
int ilogbl(long double);
double j0(double);
double j1(double);
double jn(int, double);
double ldexp(double, int);
float ldexpf(float, int);
long double ldexpl(long double, int);
double lgamma(double);
float lgammaf(float);
long double lgammal(long double);
long long llrint(double);
long long llrintf(float);
long long llrintl(long double);
long long llround(double);
long long llroundf(float);
long long llroundl(long double);
double log(double);
double log10(double);
float log10f(float);
long double log10l(long double);
double log1p(double);
float log1pf(float);
long double log1pl(long double);
double log2(double);
float log2f(float);
long double log2l(long double);
double logb(double);
float logbf(float);
long double logbl(long double);
float logf(float);
long double logl(long double);
long lrint(double);
long lrintf(float);
long lrintl(long double);
long lround(double);
long lroundf(float);
long lroundl(long double);
double modf(double, double *);
float modff(float, float *);
long double modfl(long double, long double *);
double nan(const char *);
float nanf(const char *);
long double nanl(const char *);
double nearbyint(double);
float nearbyintf(float);
long double nearbyintl(long double);
double nextafter(double, double);
float nextafterf(float, float);
long double nextafterl(long double, long double);
double nexttoward(double, long double);
float nexttowardf(float, long double);
long double nexttowardl(long double, long double);
double pow(double, double);
float powf(float, float);
long double powl(long double, long double);
double remainder(double, double);
float remainderf(float, float);
long double remainderl(long double, long double);
double remquo(double, double, int *);
float remquof(float, float, int *);
long double remquol(long double, long double, int *);
double rint(double);
float rintf(float);
long double rintl(long double);
double round(double);
float roundf(float);
long double roundl(long double);
double scalb(double, double);
double scalbln(double, long);
float scalblnf(float, long);
long double scalblnl(long double, long);
double scalbn(double, int);
float scalbnf(float, int);
long double scalbnl(long double, int);
double sin(double);
float sinf(float);
double sinh(double);
float sinhf(float);
long double sinhl(long double);
long double sinl(long double);
double sqrt(double);
float sqrtf(float);
long double sqrtl(long double);
double tan(double);
float tanf(float);
double tanh(double);
float tanhf(float);
long double tanhl(long double);
long double tanl(long double);
double tgamma(double);
float tgammaf(float);
long double tgammal(long double);
double trunc(double);
float truncf(float);
long double truncl(long double);
double y0(double);
double y1(double);
double yn(int, double);
#endif /* <sys/math.h> for sparse */

View File

@@ -0,0 +1,95 @@
/*
* Copyright (c) 2011 Nicira Networks.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at:
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef __CHECKER__
#error "Use this header only with sparse. It is not a correct implementation."
#endif
#ifndef __NETINET_IN_SPARSE
#define __NETINET_IN_SPARSE 1
#include "openvswitch/types.h"
#include <inttypes.h>
#include <sys/socket.h>
typedef ovs_be16 in_port_t;
typedef ovs_be32 in_addr_t;
struct in_addr {
in_addr_t s_addr;
};
struct sockaddr_in {
sa_family_t sin_family;
in_port_t sin_port;
struct in_addr sin_addr;
};
struct in6_addr {
union {
uint8_t u_s6_addr[16];
} u;
};
#define s6_addr u.u_s6_addr
extern const struct in6_addr in6addr_any;
#define IPPROTO_IP 0
#define IPPROTO_HOPOPTS 0
#define IPPROTO_ICMP 1
#define IPPROTO_TCP 6
#define IPPROTO_UDP 17
#define IPPROTO_ROUTING 43
#define IPPROTO_FRAGMENT 44
#define IPPROTO_AH 51
#define IPPROTO_ICMPV6 58
#define IPPROTO_NONE 59
#define IPPROTO_DSTOPTS 60
#define INADDR_ANY 0x00000000
#define INADDR_BROADCAST 0xffffffff
#define INADDR_NONE 0xffffffff
#define INET6_ADDRSTRLEN 46
static inline ovs_be32 htonl(uint32_t x)
{
return (OVS_FORCE ovs_be32) x;
}
static inline ovs_be16 htons(uint16_t x)
{
return (OVS_FORCE ovs_be16) x;
}
static inline uint32_t ntohl(ovs_be32 x)
{
return (OVS_FORCE uint32_t) x;
}
static inline uint16_t ntohs(ovs_be16 x)
{
return (OVS_FORCE uint16_t) x;
}
in_addr_t inet_addr(const char *);
int inet_aton (const char *, struct in_addr *);
char *inet_ntoa(struct in_addr);
const char *inet_ntop(int, const void *, char *, socklen_t);
int inet_pton(int, const char *, void *);
#endif /* <netinet/in.h> sparse */

View File

@@ -0,0 +1,61 @@
/*
* Copyright (c) 2011 Nicira Networks.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at:
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef __CHECKER__
#error "Use this header only with sparse. It is not a correct implementation."
#endif
#ifndef __NETINET_IP6_SPARSE
#define __NETINET_IP6_SPARSE 1
#include <netinet/in.h>
struct ip6_hdr {
union {
struct ip6_hdrctl {
ovs_be32 ip6_un1_flow;
ovs_be16 ip6_un1_plen;
uint8_t ip6_un1_nxt;
uint8_t ip6_un1_hlim;
} ip6_un1;
uint8_t ip6_un2_vfc;
} ip6_ctlun;
struct in6_addr ip6_src;
struct in6_addr ip6_dst;
};
#define ip6_vfc ip6_ctlun.ip6_un2_vfc
#define ip6_flow ip6_ctlun.ip6_un1.ip6_un1_flow
#define ip6_plen ip6_ctlun.ip6_un1.ip6_un1_plen
#define ip6_nxt ip6_ctlun.ip6_un1.ip6_un1_nxt
#define ip6_hlim ip6_ctlun.ip6_un1.ip6_un1_hlim
#define ip6_hops ip6_ctlun.ip6_un1.ip6_un1_hlim
struct ip6_ext {
uint8_t ip6e_nxt;
uint8_t ip6e_len;
};
struct ip6_frag {
uint8_t ip6f_nxt;
uint8_t ip6f_reserved;
ovs_be16 ip6f_offlg;
ovs_be32 ip6f_ident;
};
#define IP6F_OFF_MASK ((OVS_FORCE ovs_be16) 0xfff8)
#endif /* netinet/ip6.h sparse */

133
include/sparse/sys/socket.h Normal file
View File

@@ -0,0 +1,133 @@
/*
* Copyright (c) 2011 Nicira Networks.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at:
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef __CHECKER__
#error "Use this header only with sparse. It is not a correct implementation."
#endif
#ifndef __SYS_SOCKET_SPARSE
#define __SYS_SOCKET_SPARSE 1
#include "openvswitch/types.h"
#include <sys/uio.h>
typedef unsigned short int sa_family_t;
typedef __socklen_t socklen_t;
struct sockaddr {
sa_family_t sa_family;
char sa_data[64];
};
struct sockaddr_storage {
sa_family_t ss_family;
char sa_data[64];
};
struct msghdr {
void *msg_name;
socklen_t msg_namelen;
struct iovec *msg_iov;
int msg_iovlen;
void *msg_control;
socklen_t msg_controllen;
int msg_flags;
};
enum {
SOCK_DGRAM,
SOCK_RAW,
SOCK_SEQPACKET,
SOCK_STREAM
};
enum {
SOL_SOCKET
};
enum {
SO_ACCEPTCONN,
SO_BROADCAST,
SO_DEBUG,
SO_DONTROUTE,
SO_ERROR,
SO_KEEPALIVE,
SO_LINGER,
SO_OOBINLINE,
SO_RCVBUF,
SO_RCVLOWAT,
SO_RCVTIMEO,
SO_REUSEADDR,
SO_SNDBUF,
SO_SNDLOWAT,
SO_SNDTIMEO,
SO_TYPE
};
enum {
MSG_CTRUNC,
MSG_DONTROUTE,
MSG_EOR,
MSG_OOB,
MSG_NOSIGNAL,
MSG_PEEK,
MSG_TRUNC,
MSG_WAITALL,
MSG_DONTWAIT
};
enum {
AF_UNSPEC,
PF_UNSPEC = AF_UNSPEC,
AF_INET,
PF_INET = AF_INET,
AF_INET6,
PF_INET6 = AF_INET6,
AF_UNIX,
PF_UNIX = AF_UNIX,
AF_NETLINK,
PF_NETLINK = AF_NETLINK,
AF_PACKET,
PF_PACKET = AF_PACKET
};
enum {
SHUT_RD,
SHUT_RDWR,
SHUT_WR
};
int accept(int, struct sockaddr *, socklen_t *);
int bind(int, const struct sockaddr *, socklen_t);
int connect(int, const struct sockaddr *, socklen_t);
int getpeername(int, struct sockaddr *, socklen_t *);
int getsockname(int, struct sockaddr *, socklen_t *);
int getsockopt(int, int, int, void *, socklen_t *);
int listen(int, int);
ssize_t recv(int, void *, size_t, int);
ssize_t recvfrom(int, void *, size_t, int, struct sockaddr *, socklen_t *);
ssize_t recvmsg(int, struct msghdr *, int);
ssize_t send(int, const void *, size_t, int);
ssize_t sendmsg(int, const struct msghdr *, int);
ssize_t sendto(int, const void *, size_t, int, const struct sockaddr *,
socklen_t);
int setsockopt(int, int, int, const void *, socklen_t);
int shutdown(int, int);
int sockatmark(int);
int socket(int, int, int);
int socketpair(int, int, int, int[2]);
#endif /* <sys/socket.h> for sparse */

34
include/sparse/sys/wait.h Normal file
View File

@@ -0,0 +1,34 @@
/*
* Copyright (c) 2011 Nicira Networks.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at:
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef __CHECKER__
#error "Use this header only with sparse. It is not a correct implementation."
#endif
#ifndef __SYS_WAIT_SPARSE
#define __SYS_WAIT_SPARSE 1
#include_next <sys/wait.h>
#undef wait
#define wait(a) rpl_wait(a)
pid_t rpl_wait(int *);
#undef waitpid
#define waitpid(a, b, c) rpl_waitpid(a, b, c)
pid_t rpl_waitpid(pid_t, int *, int);
#endif /* <sys/wait.h> for sparse */

View File

@@ -21,6 +21,7 @@
#include <inttypes.h>
#include "openvswitch/types.h"
#ifndef __CHECKER__
static inline ovs_be64
htonll(uint64_t n)
{
@@ -32,14 +33,21 @@ ntohll(ovs_be64 n)
{
return htonl(1) == 1 ? n : ((uint64_t) ntohl(n) << 32) | ntohl(n >> 32);
}
#else
/* Making sparse happy with these functions also makes them unreadable, so
* don't bother to show it their implementations. */
ovs_be64 htonll(uint64_t);
uint64_t ntohll(ovs_be64);
#endif
/* These macros may substitute for htons(), htonl(), and htonll() in contexts
* where function calls are not allowed, such as case labels. They should not
* be used elsewhere because all of them evaluate their argument many times. */
#ifdef WORDS_BIGENDIAN
#define CONSTANT_HTONS(VALUE) ((ovs_be16) (VALUE))
#define CONSTANT_HTONL(VALUE) ((ovs_be32) (VALUE))
#define CONSTANT_HTONLL(VALUE) ((ovs_be64) (VALUE))
#if defined(WORDS_BIGENDIAN) || __CHECKER__
#define CONSTANT_HTONS(VALUE) ((OVS_FORCE ovs_be16) ((VALUE) & 0xffff))
#define CONSTANT_HTONL(VALUE) ((OVS_FORCE ovs_be32) ((VALUE) & 0xffffffff))
#define CONSTANT_HTONLL(VALUE) \
((OVS_FORCE ovs_be64) ((VALUE) & UINT64_C(0xffffffffffffffff)))
#else
#define CONSTANT_HTONS(VALUE) \
(((((ovs_be16) (VALUE)) & 0xff00) >> 8) | \

View File

@@ -18,6 +18,8 @@
#include "csum.h"
#include "unaligned.h"
#ifndef __CHECKER__
/* Returns the IP checksum of the 'n' bytes in 'data'.
*
* The return value has the same endianness as the data. That is, if 'data'
@@ -109,3 +111,8 @@ recalc_csum32(ovs_be16 old_csum, ovs_be32 old_u32, ovs_be32 new_u32)
return recalc_csum16(recalc_csum16(old_csum, old_u32, new_u32),
old_u32 >> 16, new_u32 >> 16);
}
#else /* __CHECKER__ */
/* Making sparse happy with these functions also makes them unreadable, so
* don't bother to show it their implementations. */
#endif

View File

@@ -673,7 +673,8 @@ netdev_linux_open(struct netdev_dev *netdev_dev_, int ethertype,
protocol = (ethertype == NETDEV_ETH_TYPE_ANY ? ETH_P_ALL
: ethertype == NETDEV_ETH_TYPE_802_2 ? ETH_P_802_2
: ethertype);
netdev->fd = socket(PF_PACKET, SOCK_RAW, htons(protocol));
netdev->fd = socket(PF_PACKET, SOCK_RAW,
(OVS_FORCE int) htons(protocol));
if (netdev->fd < 0) {
error = errno;
goto error;

View File

@@ -1,6 +1,8 @@
/* Copyright (c) 2002-2009 InMon Corp. Licensed under the terms of the InMon sFlow licence: */
/* http://www.inmon.com/technology/sflowlicense.txt */
#ifndef __CHECKER__ /* Don't run sparse on anything in this file. */
#include <assert.h>
#include "sflow_api.h"
@@ -830,3 +832,5 @@ static void sflError(SFLReceiver *receiver, char *msg)
sfl_agent_error(receiver->agent, "receiver", msg);
resetSampleCollector(receiver);
}
#endif /* !__CHECKER__ */

View File

@@ -156,6 +156,7 @@ put_32aligned_u64(ovs_32aligned_u64 *x, uint64_t value)
x->lo = value;
}
#ifndef __CHECKER__
/* Returns the value of 'x'. */
static inline ovs_be64
get_32aligned_be64(const ovs_32aligned_be64 *x)
@@ -179,5 +180,11 @@ put_32aligned_be64(ovs_32aligned_be64 *x, ovs_be64 value)
x->lo = value >> 32;
#endif
}
#else /* __CHECKER__ */
/* Making sparse happy with these functions also makes them unreadable, so
* don't bother to show it their implementations. */
ovs_be64 get_32aligned_be64(const ovs_32aligned_be64 *);
void put_32aligned_be64(ovs_32aligned_be64 *, ovs_be64);
#endif
#endif /* unaligned.h */

View File

@@ -252,7 +252,7 @@ sflow_choose_agent_address(const char *agent_device, const char *control_ip,
return false;
success:
agent_addr->address.ip_v4.addr = in4.s_addr;
agent_addr->address.ip_v4.addr = (OVS_FORCE uint32_t) in4.s_addr;
return true;
}

View File

@@ -1,5 +1,5 @@
/*
* Copyright (c) 2010 Nicira Networks.
* Copyright (c) 2010, 2011 Nicira Networks.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -22,6 +22,7 @@
int
main(void)
{
#ifndef __CHECKER__
/* I picked some random numbers. */
const uint16_t s = 0xc9bd;
const uint32_t l = 0xffe56ae8;
@@ -44,6 +45,9 @@ main(void)
assert(ntohll(htonll(ll)) == ll);
assert(CONSTANT_HTONLL(ntohll(ll)) == ll);
assert(ntohll(CONSTANT_HTONLL(ll)));
#else /* __CHECKER__ */
/* Making sparse happy with this code makes it unreadable, so don't bother. */
#endif
return 0;
}