From ad30bd5f2043cac0164b90937668d379be8a0069 Mon Sep 17 00:00:00 2001 From: Thibault Martin <thi.martin.pro@pm.me> Date: Mon, 8 Jul 2024 14:40:24 +0200 Subject: [PATCH] [tests] Add funptr_noreturn test + Update oracles --- .../e-acsl/tests/builtin/oracle/gen_strcat.c | 4 +- .../e-acsl/tests/builtin/oracle/gen_strcmp.c | 8 +-- .../e-acsl/tests/builtin/oracle/gen_strcpy.c | 4 +- .../e-acsl/tests/builtin/oracle/gen_strlen.c | 8 +-- .../concurrency/oracle/gen_parallel_threads.c | 4 +- .../concurrency/oracle/gen_threads_debug.c | 4 +- .../e-acsl/tests/format/oracle/gen_fprintf.c | 4 +- .../e-acsl/tests/format/oracle/gen_printf.c | 8 +-- tests/libc/oracle/fc_libc.1.res.oracle | 2 +- tests/pretty_printing/funptr_noreturn.c | 24 +++++++ .../oracle/funptr_noreturn.res.oracle | 71 +++++++++++++++++++ .../oracle/default_spec_mode.0.res.oracle | 3 +- .../oracle/default_spec_mode.1.res.oracle | 3 +- .../oracle/default_spec_mode.2.res.oracle | 3 +- .../oracle/default_spec_mode.3.res.oracle | 3 +- .../oracle/default_spec_mode.4.res.oracle | 3 +- tests/syntax/oracle/built.res.oracle | 4 +- 17 files changed, 125 insertions(+), 35 deletions(-) create mode 100644 tests/pretty_printing/funptr_noreturn.c create mode 100644 tests/pretty_printing/oracle/funptr_noreturn.res.oracle diff --git a/src/plugins/e-acsl/tests/builtin/oracle/gen_strcat.c b/src/plugins/e-acsl/tests/builtin/oracle/gen_strcat.c index f3b8d9158f2..a235f02b21d 100644 --- a/src/plugins/e-acsl/tests/builtin/oracle/gen_strcat.c +++ b/src/plugins/e-acsl/tests/builtin/oracle/gen_strcat.c @@ -51,7 +51,7 @@ extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; assigns \exit_status \from status; */ -void __gen_e_acsl_exit(int status); + __attribute__((__noreturn__)) void __gen_e_acsl_exit(int status); /*@ ensures result_ok_or_error: \result == -1 || \result >= 0; ensures @@ -784,7 +784,7 @@ pid_t __gen_e_acsl_waitpid(pid_t pid, int *stat_loc, int options) assigns \exit_status \from status; */ -void __gen_e_acsl_exit(int status) + __attribute__((__noreturn__)) void __gen_e_acsl_exit(int status) { exit(status); { diff --git a/src/plugins/e-acsl/tests/builtin/oracle/gen_strcmp.c b/src/plugins/e-acsl/tests/builtin/oracle/gen_strcmp.c index 58862fef589..22861bb8b86 100644 --- a/src/plugins/e-acsl/tests/builtin/oracle/gen_strcmp.c +++ b/src/plugins/e-acsl/tests/builtin/oracle/gen_strcmp.c @@ -53,7 +53,7 @@ extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; assigns \exit_status \from \nothing; */ -void __gen_e_acsl_abort(void); + __attribute__((__noreturn__)) void __gen_e_acsl_abort(void); /*@ terminates \false; exits status: \exit_status == \old(status); @@ -61,7 +61,7 @@ void __gen_e_acsl_abort(void); assigns \exit_status \from status; */ -void __gen_e_acsl_exit(int status); + __attribute__((__noreturn__)) void __gen_e_acsl_exit(int status); /*@ ensures result_ok_or_error: \result == -1 || \result >= 0; ensures @@ -352,7 +352,7 @@ pid_t __gen_e_acsl_waitpid(pid_t pid, int *stat_loc, int options) assigns \exit_status \from status; */ -void __gen_e_acsl_exit(int status) + __attribute__((__noreturn__)) void __gen_e_acsl_exit(int status) { exit(status); { @@ -375,7 +375,7 @@ void __gen_e_acsl_exit(int status) assigns \exit_status \from \nothing; */ -void __gen_e_acsl_abort(void) + __attribute__((__noreturn__)) void __gen_e_acsl_abort(void) { abort(); { diff --git a/src/plugins/e-acsl/tests/builtin/oracle/gen_strcpy.c b/src/plugins/e-acsl/tests/builtin/oracle/gen_strcpy.c index 72d8735dd4a..9c38744e026 100644 --- a/src/plugins/e-acsl/tests/builtin/oracle/gen_strcpy.c +++ b/src/plugins/e-acsl/tests/builtin/oracle/gen_strcpy.c @@ -45,7 +45,7 @@ extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; assigns \exit_status \from status; */ -void __gen_e_acsl_exit(int status); + __attribute__((__noreturn__)) void __gen_e_acsl_exit(int status); /*@ ensures result_ok_or_error: \result == -1 || \result >= 0; ensures @@ -765,7 +765,7 @@ pid_t __gen_e_acsl_waitpid(pid_t pid, int *stat_loc, int options) assigns \exit_status \from status; */ -void __gen_e_acsl_exit(int status) + __attribute__((__noreturn__)) void __gen_e_acsl_exit(int status) { exit(status); { diff --git a/src/plugins/e-acsl/tests/builtin/oracle/gen_strlen.c b/src/plugins/e-acsl/tests/builtin/oracle/gen_strlen.c index 4aefe12825d..fbde72d4e6b 100644 --- a/src/plugins/e-acsl/tests/builtin/oracle/gen_strlen.c +++ b/src/plugins/e-acsl/tests/builtin/oracle/gen_strlen.c @@ -36,7 +36,7 @@ extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; assigns \exit_status \from \nothing; */ -void __gen_e_acsl_abort(void); + __attribute__((__noreturn__)) void __gen_e_acsl_abort(void); /*@ terminates \false; exits status: \exit_status == \old(status); @@ -44,7 +44,7 @@ void __gen_e_acsl_abort(void); assigns \exit_status \from status; */ -void __gen_e_acsl_exit(int status); + __attribute__((__noreturn__)) void __gen_e_acsl_exit(int status); /*@ ensures result_ok_or_error: \result == -1 || \result >= 0; ensures @@ -326,7 +326,7 @@ pid_t __gen_e_acsl_waitpid(pid_t pid, int *stat_loc, int options) assigns \exit_status \from status; */ -void __gen_e_acsl_exit(int status) + __attribute__((__noreturn__)) void __gen_e_acsl_exit(int status) { exit(status); { @@ -349,7 +349,7 @@ void __gen_e_acsl_exit(int status) assigns \exit_status \from \nothing; */ -void __gen_e_acsl_abort(void) + __attribute__((__noreturn__)) void __gen_e_acsl_abort(void) { abort(); { diff --git a/src/plugins/e-acsl/tests/concurrency/oracle/gen_parallel_threads.c b/src/plugins/e-acsl/tests/concurrency/oracle/gen_parallel_threads.c index a73f89d3e51..b6071854f7c 100644 --- a/src/plugins/e-acsl/tests/concurrency/oracle/gen_parallel_threads.c +++ b/src/plugins/e-acsl/tests/concurrency/oracle/gen_parallel_threads.c @@ -133,7 +133,7 @@ void __gen_e_acsl_perror(char const *s); assigns \exit_status \from status; */ -void __gen_e_acsl_exit(int status); + __attribute__((__noreturn__)) void __gen_e_acsl_exit(int status); /*@ ensures result_ok_or_error: \result == 0 || \result == -1; assigns \result, Frama_C_entropy_source; @@ -768,7 +768,7 @@ int __gen_e_acsl_usleep(useconds_t usec) assigns \exit_status \from status; */ -void __gen_e_acsl_exit(int status) + __attribute__((__noreturn__)) void __gen_e_acsl_exit(int status) { __e_acsl_store_block((void *)(& status),4UL); exit(status); diff --git a/src/plugins/e-acsl/tests/concurrency/oracle/gen_threads_debug.c b/src/plugins/e-acsl/tests/concurrency/oracle/gen_threads_debug.c index 7583e2dc85f..2a778a1f8cc 100644 --- a/src/plugins/e-acsl/tests/concurrency/oracle/gen_threads_debug.c +++ b/src/plugins/e-acsl/tests/concurrency/oracle/gen_threads_debug.c @@ -133,7 +133,7 @@ void __gen_e_acsl_perror(char const *s); assigns \exit_status \from status; */ -void __gen_e_acsl_exit(int status); + __attribute__((__noreturn__)) void __gen_e_acsl_exit(int status); /*@ ensures result_ok_or_error: \result == 0 || \result == -1; assigns \result, Frama_C_entropy_source; @@ -450,7 +450,7 @@ int __gen_e_acsl_usleep(useconds_t usec) assigns \exit_status \from status; */ -void __gen_e_acsl_exit(int status) + __attribute__((__noreturn__)) void __gen_e_acsl_exit(int status) { __e_acsl_store_block((void *)(& status),4UL); exit(status); diff --git a/src/plugins/e-acsl/tests/format/oracle/gen_fprintf.c b/src/plugins/e-acsl/tests/format/oracle/gen_fprintf.c index 8aa685ba92e..ed7d5351a40 100644 --- a/src/plugins/e-acsl/tests/format/oracle/gen_fprintf.c +++ b/src/plugins/e-acsl/tests/format/oracle/gen_fprintf.c @@ -66,7 +66,7 @@ int __gen_e_acsl_fclose(FILE *stream); assigns \exit_status \from status; */ -void __gen_e_acsl_exit(int status); + __attribute__((__noreturn__)) void __gen_e_acsl_exit(int status); /*@ ensures result_ok_or_error: \result == -1 || \result >= 0; ensures @@ -262,7 +262,7 @@ pid_t __gen_e_acsl_waitpid(pid_t pid, int *stat_loc, int options) assigns \exit_status \from status; */ -void __gen_e_acsl_exit(int status) + __attribute__((__noreturn__)) void __gen_e_acsl_exit(int status) { exit(status); { diff --git a/src/plugins/e-acsl/tests/format/oracle/gen_printf.c b/src/plugins/e-acsl/tests/format/oracle/gen_printf.c index fed7aed3b60..0fd82086aff 100644 --- a/src/plugins/e-acsl/tests/format/oracle/gen_printf.c +++ b/src/plugins/e-acsl/tests/format/oracle/gen_printf.c @@ -478,7 +478,7 @@ extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; assigns \exit_status \from \nothing; */ -void __gen_e_acsl_abort(void); + __attribute__((__noreturn__)) void __gen_e_acsl_abort(void); /*@ terminates \false; exits status: \exit_status == \old(status); @@ -486,7 +486,7 @@ void __gen_e_acsl_abort(void); assigns \exit_status \from status; */ -void __gen_e_acsl_exit(int status); + __attribute__((__noreturn__)) void __gen_e_acsl_exit(int status); /*@ ensures result_ok_or_error: \result == -1 || \result >= 0; ensures @@ -1119,7 +1119,7 @@ pid_t __gen_e_acsl_waitpid(pid_t pid, int *stat_loc, int options) assigns \exit_status \from status; */ -void __gen_e_acsl_exit(int status) + __attribute__((__noreturn__)) void __gen_e_acsl_exit(int status) { exit(status); { @@ -1142,7 +1142,7 @@ void __gen_e_acsl_exit(int status) assigns \exit_status \from \nothing; */ -void __gen_e_acsl_abort(void) + __attribute__((__noreturn__)) void __gen_e_acsl_abort(void) { abort(); { diff --git a/tests/libc/oracle/fc_libc.1.res.oracle b/tests/libc/oracle/fc_libc.1.res.oracle index 88b5d0e3123..67ee1541e1c 100644 --- a/tests/libc/oracle/fc_libc.1.res.oracle +++ b/tests/libc/oracle/fc_libc.1.res.oracle @@ -907,7 +907,7 @@ extern __attribute__((__noreturn__)) void __builtin_abort(void); ensures never_terminates: \false; assigns \nothing; */ __attribute__((__noreturn__, __FC_BUILTIN__)) void Frama_C_abort(void); -void Frama_C_abort(void) + __attribute__((__noreturn__)) void Frama_C_abort(void) { __builtin_abort(); return; diff --git a/tests/pretty_printing/funptr_noreturn.c b/tests/pretty_printing/funptr_noreturn.c new file mode 100644 index 00000000000..d1e5b586f5f --- /dev/null +++ b/tests/pretty_printing/funptr_noreturn.c @@ -0,0 +1,24 @@ +/* run.config + STDOPT: +*/ + +#include <stdlib.h> + +__attribute__((__noreturn__)) void f1() { + exit(0); +} + +__attribute__((__noreturn__)) void f2(){ + __attribute__((__noreturn__)) void (*funptr)(void) = &f1; + (*funptr)(); +} + +_Noreturn void g1() { + exit(0); +} + +_Noreturn void g2(){ + _Noreturn void (*funptr)(void) = &g1; + (*funptr)(); +} + diff --git a/tests/pretty_printing/oracle/funptr_noreturn.res.oracle b/tests/pretty_printing/oracle/funptr_noreturn.res.oracle new file mode 100644 index 00000000000..365d5165e0a --- /dev/null +++ b/tests/pretty_printing/oracle/funptr_noreturn.res.oracle @@ -0,0 +1,71 @@ +[kernel] Parsing funptr_noreturn.c (with preprocessing) +/* Generated by Frama-C */ +#include "errno.h" +#include "stdlib.h" + __attribute__((__noreturn__)) void f1(void) +{ + exit(0); + return; +} + + __attribute__((__noreturn__)) void f2(void) +{ + void ( __attribute__((__noreturn__)) (*funptr))(void) = & f1; + (*funptr)(); + return; +} + + __attribute__((__noreturn__)) void g1(void) +{ + exit(0); + return; +} + + __attribute__((__noreturn__)) void g2(void) +{ + void ( __attribute__((__noreturn__)) (*funptr))(void) = & g1; + (*funptr)(); + return; +} + + +[kernel] Parsing ocode_funptr_noreturn.c (with preprocessing) +[kernel] Parsing funptr_noreturn.c (with preprocessing) +[kernel] funptr_noreturn.c:7: Warning: + def'n of func f1 at funptr_noreturn.c:7 (sum 887) conflicts with the one at ocode_funptr_noreturn.c:4 (sum 1081); keeping the one at ocode_funptr_noreturn.c:4. +[kernel] funptr_noreturn.c:11: Warning: + def'n of func f2 at funptr_noreturn.c:11 (sum 1774) conflicts with the one at ocode_funptr_noreturn.c:10 (sum 1968); keeping the one at ocode_funptr_noreturn.c:10. +[kernel] funptr_noreturn.c:16: Warning: + def'n of func g1 at funptr_noreturn.c:16 (sum 887) conflicts with the one at ocode_funptr_noreturn.c:17 (sum 1081); keeping the one at ocode_funptr_noreturn.c:17. +[kernel] funptr_noreturn.c:20: Warning: + def'n of func g2 at funptr_noreturn.c:20 (sum 1774) conflicts with the one at ocode_funptr_noreturn.c:23 (sum 1968); keeping the one at ocode_funptr_noreturn.c:23. +/* Generated by Frama-C */ +#include "errno.h" +#include "stdlib.h" + __attribute__((__noreturn__)) void f1(void) +{ + exit(0); + return; +} + + __attribute__((__noreturn__)) void f2(void) +{ + void ( __attribute__((__noreturn__)) (*funptr))(void) = & f1; + (*funptr)(); + return; +} + + __attribute__((__noreturn__)) void g1(void) +{ + exit(0); + return; +} + + __attribute__((__noreturn__)) void g2(void) +{ + void ( __attribute__((__noreturn__)) (*funptr))(void) = & g1; + (*funptr)(); + return; +} + + diff --git a/tests/spec/oracle/default_spec_mode.0.res.oracle b/tests/spec/oracle/default_spec_mode.0.res.oracle index 06e27d95b34..b3e13b9e5d8 100644 --- a/tests/spec/oracle/default_spec_mode.0.res.oracle +++ b/tests/spec/oracle/default_spec_mode.0.res.oracle @@ -56,8 +56,7 @@ int f4(int *b) /*@ terminates \false; exits \false; allocates \nothing; */ - __attribute__((__noreturn__)) void f5(void); -void f5(void) + __attribute__((__noreturn__)) void f5(void) { while (1) ; return; diff --git a/tests/spec/oracle/default_spec_mode.1.res.oracle b/tests/spec/oracle/default_spec_mode.1.res.oracle index 28bd6a55879..7668bbc5033 100644 --- a/tests/spec/oracle/default_spec_mode.1.res.oracle +++ b/tests/spec/oracle/default_spec_mode.1.res.oracle @@ -46,8 +46,7 @@ int f4(int *b) exits \false; assigns \nothing; allocates \nothing; */ - __attribute__((__noreturn__)) void f5(void); -void f5(void) + __attribute__((__noreturn__)) void f5(void) { while (1) ; return; diff --git a/tests/spec/oracle/default_spec_mode.2.res.oracle b/tests/spec/oracle/default_spec_mode.2.res.oracle index a4e0f835c66..b403960922c 100644 --- a/tests/spec/oracle/default_spec_mode.2.res.oracle +++ b/tests/spec/oracle/default_spec_mode.2.res.oracle @@ -69,8 +69,7 @@ int f4(int *b) exits \false; assigns \nothing; allocates \nothing; */ - __attribute__((__noreturn__)) void f5(void); -void f5(void) + __attribute__((__noreturn__)) void f5(void) { while (1) ; return; diff --git a/tests/spec/oracle/default_spec_mode.3.res.oracle b/tests/spec/oracle/default_spec_mode.3.res.oracle index e1e0f73f927..b6067af62b3 100644 --- a/tests/spec/oracle/default_spec_mode.3.res.oracle +++ b/tests/spec/oracle/default_spec_mode.3.res.oracle @@ -71,8 +71,7 @@ int f4(int *b) exits \false; assigns \nothing; allocates \nothing; */ - __attribute__((__noreturn__)) void f5(void); -void f5(void) + __attribute__((__noreturn__)) void f5(void) { while (1) ; return; diff --git a/tests/spec/oracle/default_spec_mode.4.res.oracle b/tests/spec/oracle/default_spec_mode.4.res.oracle index b2591584562..0822b20709a 100644 --- a/tests/spec/oracle/default_spec_mode.4.res.oracle +++ b/tests/spec/oracle/default_spec_mode.4.res.oracle @@ -53,8 +53,7 @@ int f4(int *b) /*@ terminates \false; assigns \nothing; allocates \nothing; */ - __attribute__((__noreturn__)) void f5(void); -void f5(void) + __attribute__((__noreturn__)) void f5(void) { while (1) ; return; diff --git a/tests/syntax/oracle/built.res.oracle b/tests/syntax/oracle/built.res.oracle index c763be7e968..5b247f48b47 100644 --- a/tests/syntax/oracle/built.res.oracle +++ b/tests/syntax/oracle/built.res.oracle @@ -2,8 +2,8 @@ [kernel] built.i:21: Case label -1 exceeds range of unsigned int for switch expression. Nothing to worry. /* Generated by Frama-C */ -__inline static _Noreturn int dummy_f__fc_inline(void); -__inline static int dummy_f__fc_inline(void) +__inline static __attribute__((__noreturn__)) int dummy_f__fc_inline +(void) { int __retres; while (1) ; -- GitLab