diff --git a/share/libc/features.h b/share/libc/features.h index 0aa904e48573e3535006b3fac1112abc9bf27426..77ea2e2cac68158bb7c727efe0098ab9ef547fdc 100644 --- a/share/libc/features.h +++ b/share/libc/features.h @@ -115,5 +115,12 @@ #define __USE_ISOC99 1 +// When linking code including Frama-C's libc, we avoid adding 'extern' +// to some variable declarations. In this case, __FC_EXTERN is defined to +// the empty string. Otherwise, define it to 'extern'. +#ifndef __FC_EXTERN +#define __FC_EXTERN extern +#endif + /* end __FC_FEATURES_H */ #endif diff --git a/share/libc/libgen.h b/share/libc/libgen.h index 84a397167bba58916fa050901842843fa26715e5..54eda346537cd771aed962413bc6adb65504a8b8 100644 --- a/share/libc/libgen.h +++ b/share/libc/libgen.h @@ -28,7 +28,7 @@ __PUSH_FC_STDLIB __BEGIN_DECLS -extern char __fc_basename[__FC_PATH_MAX]; +__FC_EXTERN char __fc_basename[__FC_PATH_MAX]; char *__fc_p_basename = __fc_basename; /*@ // missing: assigns path[0 ..], __fc_p_basename[0 ..] \from 'filesystem'; @@ -40,7 +40,7 @@ char *__fc_p_basename = __fc_basename; */ extern char *basename(char *path); -extern char __fc_dirname[__FC_PATH_MAX]; +__FC_EXTERN char __fc_dirname[__FC_PATH_MAX]; char *__fc_p_dirname = __fc_dirname; /*@ // missing: assigns path[0 ..], __fc_p_dirname[0 ..] \from 'filesystem'; diff --git a/share/libc/pwd.h b/share/libc/pwd.h index f0e37fef4d6d1b36d513e07ea8beedac43e7df6a..2666ef3298b503a17ead4ca3f0b97904298ee98a 100644 --- a/share/libc/pwd.h +++ b/share/libc/pwd.h @@ -44,10 +44,10 @@ struct passwd { char *pw_shell; }; -extern char __fc_getpwuid_pw_name[64]; -extern char __fc_getpwuid_pw_passwd[64]; -extern char __fc_getpwuid_pw_dir[64]; -extern char __fc_getpwuid_pw_shell[64]; +__FC_EXTERN char __fc_getpwuid_pw_name[64]; +__FC_EXTERN char __fc_getpwuid_pw_passwd[64]; +__FC_EXTERN char __fc_getpwuid_pw_dir[64]; +__FC_EXTERN char __fc_getpwuid_pw_shell[64]; struct passwd __fc_pwd = {.pw_name = __fc_getpwuid_pw_name, diff --git a/share/libc/signal.h b/share/libc/signal.h index 37749792bb6187579df6a8e994f804b9bfd99e7f..acf3cfd95fab5e5803d8aef76950b9b7dcd122db 100644 --- a/share/libc/signal.h +++ b/share/libc/signal.h @@ -201,7 +201,7 @@ extern int sigdelset(sigset_t *set, int signum); */ extern int sigismember(const sigset_t *set, int signum); -extern struct sigaction __fc_sigaction[SIGRTMAX+1]; +__FC_EXTERN struct sigaction __fc_sigaction[SIGRTMAX+1]; struct sigaction *__fc_p_sigaction = __fc_sigaction; /*@ // missing: errno may be set to EINVAL when trying to set some signals diff --git a/share/libc/stdlib.h b/share/libc/stdlib.h index 98735a9afbaabfd7ad65bda2459c2a1b60231e9a..688c2885483ab84cac47bdaae2a7ad9d8582bb08 100644 --- a/share/libc/stdlib.h +++ b/share/libc/stdlib.h @@ -286,7 +286,7 @@ extern void srandom(unsigned int seed); // used to check if some *48() functions have called the seed initializer int __fc_random48_init; -extern unsigned short __fc_random48_counter[3]; +__FC_EXTERN unsigned short __fc_random48_counter[3]; unsigned short *__fc_p_random48_counter = __fc_random48_counter; /*@ diff --git a/share/libc/string.h b/share/libc/string.h index fa5202ebf4aa0bc12b3cc3e015cbc771fdc5ee45..39b1c43044e73259b624ef6a348669f8a123279f 100644 --- a/share/libc/string.h +++ b/share/libc/string.h @@ -336,7 +336,7 @@ extern char *strtok_r(char *restrict s, const char *restrict delim, char **restr @*/ extern char *strsep (char **stringp, const char *delim); -extern char __fc_strerror[64]; +__FC_EXTERN char __fc_strerror[64]; char * const __fc_p_strerror = __fc_strerror; // Note: postcondition "result_nul_terminated" is only a temporary patch, @@ -514,7 +514,7 @@ extern char *stpncpy(char *restrict dest, const char *restrict src, size_t n); //extern char *strerror_l(int errnum, locale_t locale); extern int strerror_r(int errnum, char *strerrbuf, size_t buflen); -extern char __fc_strsignal[64]; +__FC_EXTERN char __fc_strsignal[64]; char * const __fc_p_strsignal = __fc_strsignal; /*@ //missing: requires valid_signal(signum); diff --git a/share/libc/sys/time.h b/share/libc/sys/time.h index ce3c8be4b5029c0c74d8d54edff859949934a7ae..fbd3da31927d47879bb7ef0c81bf878ba4b5fbc7 100644 --- a/share/libc/sys/time.h +++ b/share/libc/sys/time.h @@ -99,8 +99,9 @@ extern int gettimeofday(struct timeval * restrict tv, void * restrict tz); */ extern int settimeofday(const struct timeval *tv, const struct timezone *tz); -#if (defined _POSIX_C_SOURCE && (_POSIX_C_SOURCE) >= 200112L) || \ - (defined _XOPEN_SOURCE && (_XOPEN_SOURCE) >= 600) +// Note: definitions related to itimerval are obsolescent in POSIX and may be +// removed in future versions. Strictly conforming applications should not use +// them. #define ITIMER_REAL 0 #define ITIMER_VIRTUAL 1 #define ITIMER_PROF 2 @@ -199,7 +200,6 @@ extern int getitimer(int which, struct itimerval *curr_value); extern int setitimer (int which, const struct itimerval *restrict new_value, struct itimerval *restrict old_value); -#endif // Non-POSIX, non-C99 functions (present in Linux and most BSDs) extern void timeradd(struct timeval *a, struct timeval *b, diff --git a/share/libc/unistd.h b/share/libc/unistd.h index e2d7c4000014cbc12ae389de90f07b8601f6cb16..a8c71c4da66bfde812e77250d56ab9b6192509b8 100644 --- a/share/libc/unistd.h +++ b/share/libc/unistd.h @@ -1104,7 +1104,7 @@ extern pid_t tcgetpgrp(int); extern int tcsetpgrp(int, pid_t); extern int truncate(const char *, off_t); -extern volatile char __fc_ttyname[TTY_NAME_MAX]; +__FC_EXTERN volatile char __fc_ttyname[TTY_NAME_MAX]; volatile char *__fc_p_ttyname = __fc_ttyname; /*@ diff --git a/src/plugins/e-acsl/tests/format/oracle_ci/gen_printf.c b/src/plugins/e-acsl/tests/format/oracle_ci/gen_printf.c index d9ada05d4207950e6c8b590c366c45354ebea8d0..7268da8856d2fa7c9e31f8aa80193f48014b612e 100644 --- a/src/plugins/e-acsl/tests/format/oracle_ci/gen_printf.c +++ b/src/plugins/e-acsl/tests/format/oracle_ci/gen_printf.c @@ -7,6 +7,7 @@ #include "string.h" #include "sys/select.h" #include "sys/time.h" +#include "sys/types.h" #include "sys/wait.h" #include "time.h" #include "unistd.h"