2015-01-30 07:52:32 +01:00
|
|
|
|
|
|
|
// Test library configuration for posix.cfg
|
|
|
|
//
|
|
|
|
// Usage:
|
2015-02-16 22:19:51 +01:00
|
|
|
// $ cppcheck --check-library --library=posix --enable=information --error-exitcode=1 --inline-suppr --suppress=missingIncludeSystem test/cfg/posix.c
|
2015-01-30 07:52:32 +01:00
|
|
|
// =>
|
|
|
|
// No warnings about bad library configuration, unmatched suppressions, etc. exitcode=0
|
|
|
|
//
|
|
|
|
|
2015-02-15 18:11:09 +01:00
|
|
|
#include <stdio.h> // <- FILE
|
|
|
|
#include <dirent.h>
|
|
|
|
#include <sys/mman.h>
|
|
|
|
#include <sys/socket.h>
|
|
|
|
#include <fcntl.h>
|
2015-02-21 11:08:58 +01:00
|
|
|
#include <netdb.h>
|
2015-01-30 07:52:32 +01:00
|
|
|
#include <unistd.h>
|
2015-02-20 20:50:20 +01:00
|
|
|
#include <regex.h>
|
2015-02-15 18:11:09 +01:00
|
|
|
|
|
|
|
void bufferAccessOutOfBounds(int fd) {
|
2015-02-10 17:29:36 +01:00
|
|
|
char a[5];
|
|
|
|
read(fd,a,5);
|
|
|
|
// cppcheck-suppress bufferAccessOutOfBounds
|
|
|
|
read(fd,a,6);
|
|
|
|
write(fd,a,5);
|
|
|
|
// cppcheck-suppress bufferAccessOutOfBounds
|
|
|
|
write(fd,a,6);
|
|
|
|
recv(fd,a,5,0);
|
|
|
|
// cppcheck-suppress bufferAccessOutOfBounds
|
|
|
|
recv(fd,a,6,0);
|
|
|
|
recvfrom(fd,a,5,0,0x0,0x0);
|
|
|
|
// cppcheck-suppress bufferAccessOutOfBounds
|
|
|
|
recvfrom(fd,a,6,0,0x0,0x0);
|
|
|
|
send(fd,a,5,0);
|
|
|
|
// cppcheck-suppress bufferAccessOutOfBounds
|
|
|
|
send(fd,a,6,0);
|
|
|
|
sendto(fd,a,5,0,0x0,0x0);
|
|
|
|
// cppcheck-suppress bufferAccessOutOfBounds
|
|
|
|
sendto(fd,a,6,0,0x0,0x0);
|
2015-02-16 22:19:51 +01:00
|
|
|
// cppcheck-suppress constStatement
|
2015-02-10 17:29:36 +01:00
|
|
|
0;
|
|
|
|
}
|
|
|
|
|
2015-02-15 18:11:09 +01:00
|
|
|
void nullPointer(char *p) {
|
2015-01-30 07:52:32 +01:00
|
|
|
isatty (0);
|
|
|
|
mkdir (p, 0);
|
|
|
|
getcwd (0, 0);
|
|
|
|
// cppcheck-suppress nullPointer
|
|
|
|
readdir (0);
|
|
|
|
}
|
|
|
|
|
2015-02-21 11:08:58 +01:00
|
|
|
void memleak_getaddrinfo() {
|
|
|
|
//TODO: nothing to report yet, see http://sourceforge.net/p/cppcheck/discussion/general/thread/d9737d5d/
|
|
|
|
struct addrinfo * res=NULL;
|
|
|
|
getaddrinfo("node", NULL, NULL, &res);
|
|
|
|
freeaddrinfo(res);
|
|
|
|
}
|
|
|
|
|
2015-02-16 22:19:51 +01:00
|
|
|
void memleak_mmap(int fd) {
|
|
|
|
// cppcheck-suppress unreadVariable
|
2015-02-15 18:11:09 +01:00
|
|
|
void *addr = mmap(NULL, 255, PROT_NONE, MAP_PRIVATE, fd, 0);
|
|
|
|
// cppcheck-suppress memleak
|
|
|
|
}
|
|
|
|
|
|
|
|
/* TODO: add configuration for fdopen
|
|
|
|
void resourceLeak_fdopen(int fd) {
|
|
|
|
FILE *f = fdopen(fd, "r");
|
|
|
|
// cppcheck-suppress resourceLeak
|
|
|
|
}
|
|
|
|
*/
|
|
|
|
|
|
|
|
void resourceLeak_fdopendir(int fd) {
|
2015-02-16 22:19:51 +01:00
|
|
|
// cppcheck-suppress unreadVariable
|
2015-02-15 18:11:09 +01:00
|
|
|
DIR* leak1 = fdopendir(fd);
|
|
|
|
// cppcheck-suppress resourceLeak
|
|
|
|
}
|
|
|
|
|
|
|
|
void resourceLeak_opendir(void) {
|
2015-02-16 22:19:51 +01:00
|
|
|
// cppcheck-suppress unreadVariable
|
2015-02-15 18:11:09 +01:00
|
|
|
DIR* leak1 = opendir("abc");
|
|
|
|
// cppcheck-suppress resourceLeak
|
|
|
|
}
|
|
|
|
|
|
|
|
void resourceLeak_socket(void) {
|
2015-02-16 22:19:51 +01:00
|
|
|
// cppcheck-suppress unreadVariable
|
2015-02-15 18:11:09 +01:00
|
|
|
int s = socket(AF_INET, SOCK_STREAM, 0);
|
|
|
|
// cppcheck-suppress resourceLeak
|
|
|
|
}
|
|
|
|
|
|
|
|
void noleak(int x, int y, int z) {
|
|
|
|
DIR *p1 = fdopendir(x); closedir(p1);
|
|
|
|
DIR *p2 = opendir("abc"); closedir(p2);
|
|
|
|
int s = socket(AF_INET,SOCK_STREAM,0); close(s);
|
|
|
|
/* TODO: add configuration for open/fdopen
|
|
|
|
// #2830
|
|
|
|
int fd = open("path", O_RDONLY);
|
|
|
|
FILE *f = fdopen(fd, "rt");
|
|
|
|
fclose(f);
|
|
|
|
*/
|
|
|
|
}
|
2015-02-16 16:25:27 +01:00
|
|
|
|
|
|
|
|
|
|
|
// unused return value
|
|
|
|
|
|
|
|
void ignoredReturnValue(void *addr, int fd) {
|
2015-02-16 22:19:51 +01:00
|
|
|
// cppcheck-suppress ignoredReturnValue
|
2015-02-16 16:25:27 +01:00
|
|
|
// cppcheck-suppress leakReturnValNotUsed
|
|
|
|
mmap(addr, 255, PROT_NONE, MAP_PRIVATE, fd, 0);
|
|
|
|
// cppcheck-suppress ignoredReturnValue
|
2015-02-16 22:19:51 +01:00
|
|
|
setuid(42);
|
|
|
|
// cppcheck-suppress ignoredReturnValue
|
|
|
|
getuid();
|
2015-02-16 16:25:27 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// valid range
|
|
|
|
|
|
|
|
void invalidFunctionArg() {
|
|
|
|
// cppcheck-suppress invalidFunctionArg
|
|
|
|
usleep(-1);
|
|
|
|
usleep(0);
|
|
|
|
usleep(999999);
|
|
|
|
// cppcheck-suppress invalidFunctionArg
|
|
|
|
usleep(1000000);
|
|
|
|
}
|
2015-02-17 18:08:19 +01:00
|
|
|
|
|
|
|
void uninitvar(int fd) {
|
|
|
|
int x;
|
|
|
|
char buf[2];
|
|
|
|
// cppcheck-suppress uninitvar
|
|
|
|
write(x,"ab",2);
|
|
|
|
// cppcheck-suppress uninitvar
|
|
|
|
write(fd,buf,2);
|
|
|
|
// cppcheck-suppress uninitvar
|
|
|
|
write(fd,"ab",x);
|
2015-02-20 20:50:20 +01:00
|
|
|
|
|
|
|
|
|
|
|
/* int regcomp(regex_t *restrict preg, const char *restrict pattern, int cflags); */
|
|
|
|
regex_t reg;
|
|
|
|
const char * pattern;
|
|
|
|
int cflags;
|
|
|
|
// cppcheck-suppress uninitvar
|
|
|
|
regcomp(®, pattern, cflags);
|
|
|
|
pattern="";
|
|
|
|
// cppcheck-suppress uninitvar
|
|
|
|
regcomp(®, pattern, cflags);
|
2015-02-17 18:08:19 +01:00
|
|
|
}
|
2015-02-17 18:16:29 +01:00
|
|
|
|
|
|
|
void uninitvar_types(void) {
|
2015-02-17 19:58:07 +01:00
|
|
|
// cppcheck-suppress unassignedVariable
|
2015-02-17 18:16:29 +01:00
|
|
|
blkcnt_t b;
|
|
|
|
// cppcheck-suppress uninitvar
|
2015-02-17 19:58:07 +01:00
|
|
|
b + 1;
|
2015-02-17 18:16:29 +01:00
|
|
|
|
2015-02-17 19:58:07 +01:00
|
|
|
struct dirent d;
|
2015-02-17 18:16:29 +01:00
|
|
|
// cppcheck-suppress uninitvar
|
2015-02-17 19:58:07 +01:00
|
|
|
d.d_ino + 1;
|
2015-02-17 18:16:29 +01:00
|
|
|
}
|