diff --git a/src/ansi-c/library/stdio.c b/src/ansi-c/library/stdio.c index d3c49bce9d1..ef4932d30ad 100644 --- a/src/ansi-c/library/stdio.c +++ b/src/ansi-c/library/stdio.c @@ -72,35 +72,12 @@ __CPROVER_HIDE:; void fclose_cleanup(void *stream); __CPROVER_bool __VERIFIER_nondet___CPROVER_bool(void); +FILE *fopen64(const char *filename, const char *mode); FILE *fopen(const char *filename, const char *mode) { - __CPROVER_HIDE:; - (void)*filename; - (void)*mode; -#ifdef __CPROVER_STRING_ABSTRACTION - __CPROVER_assert(__CPROVER_is_zero_string(filename), "fopen zero-termination of 1st argument"); - __CPROVER_assert(__CPROVER_is_zero_string(mode), "fopen zero-termination of 2nd argument"); -#endif - - FILE *fopen_result; - - __CPROVER_bool fopen_error=__VERIFIER_nondet___CPROVER_bool(); - -#if !defined(__linux__) || defined(__GLIBC__) - fopen_result=fopen_error?NULL:malloc(sizeof(FILE)); -#else - // libraries need to expose the definition of FILE; this is the - // case for musl - fopen_result=fopen_error?NULL:malloc(sizeof(int)); -#endif - -#ifdef __CPROVER_CUSTOM_BITVECTOR_ANALYSIS - __CPROVER_set_must(fopen_result, "open"); - __CPROVER_cleanup(fopen_result, fclose_cleanup); -#endif - - return fopen_result; +__CPROVER_HIDE:; + return fopen64(filename, mode); } /* FUNCTION: _fopen */ @@ -152,6 +129,54 @@ __CPROVER_HIDE:; } #endif +/* FUNCTION: fopen64 */ + +#ifndef __CPROVER_STDIO_H_INCLUDED +# include +# define __CPROVER_STDIO_H_INCLUDED +#endif + +#ifndef __CPROVER_STDLIB_H_INCLUDED +# include +# define __CPROVER_STDLIB_H_INCLUDED +#endif + +void fclose_cleanup(void *stream); +__CPROVER_bool __VERIFIER_nondet___CPROVER_bool(void); + +FILE *fopen64(const char *filename, const char *mode) +{ +__CPROVER_HIDE:; + (void)*filename; + (void)*mode; +#ifdef __CPROVER_STRING_ABSTRACTION + __CPROVER_assert( + __CPROVER_is_zero_string(filename), + "fopen zero-termination of 1st argument"); + __CPROVER_assert( + __CPROVER_is_zero_string(mode), "fopen zero-termination of 2nd argument"); +#endif + + FILE *fopen_result; + + __CPROVER_bool fopen_error = __VERIFIER_nondet___CPROVER_bool(); + +#if !defined(__linux__) || defined(__GLIBC__) + fopen_result = fopen_error ? NULL : malloc(sizeof(FILE)); +#else + // libraries need to expose the definition of FILE; this is the + // case for musl + fopen_result = fopen_error ? NULL : malloc(sizeof(int)); +#endif + +#ifdef __CPROVER_CUSTOM_BITVECTOR_ANALYSIS + __CPROVER_set_must(fopen_result, "open"); + __CPROVER_cleanup(fopen_result, fclose_cleanup); +#endif + + return fopen_result; +} + /* FUNCTION: freopen */ #ifndef __CPROVER_STDIO_H_INCLUDED @@ -159,7 +184,22 @@ __CPROVER_HIDE:; #define __CPROVER_STDIO_H_INCLUDED #endif +FILE *freopen64(const char *filename, const char *mode, FILE *f); + FILE *freopen(const char *filename, const char *mode, FILE *f) +{ +__CPROVER_HIDE:; + return freopen64(filename, mode, f); +} + +/* FUNCTION: freopen64 */ + +#ifndef __CPROVER_STDIO_H_INCLUDED +# include +# define __CPROVER_STDIO_H_INCLUDED +#endif + +FILE *freopen64(const char *filename, const char *mode, FILE *f) { __CPROVER_HIDE:; (void)*filename; diff --git a/src/ansi-c/library_check.sh b/src/ansi-c/library_check.sh index 6fbef4cc5dc..ecea459eb89 100755 --- a/src/ansi-c/library_check.sh +++ b/src/ansi-c/library_check.sh @@ -55,6 +55,8 @@ perl -p -i -e 's/^__swbuf\n//' __functions # putc, FreeBSD perl -p -i -e 's/^__CPROVER_deallocate\n//' __functions # free-01 perl -p -i -e 's/^__builtin_alloca\n//' __functions # alloca-01 perl -p -i -e 's/^fclose_cleanup\n//' __functions # fopen +perl -p -i -e 's/^fopen64\n//' __functions # fopen +perl -p -i -e 's/^freopen64\n//' __functions # freopen perl -p -i -e 's/^munmap\n//' __functions # mmap-01 perl -p -i -e 's/^__fgets_chk\n//' __functions # fgets-01/__fgets_chk.desc perl -p -i -e 's/^__fprintf_chk\n//' __functions # fprintf-01/__fprintf_chk.desc