File tree Expand file tree Collapse file tree 3 files changed +49
-0
lines changed
regression/cbmc/destructor1 Expand file tree Collapse file tree 3 files changed +49
-0
lines changed Original file line number Diff line number Diff line change 1+ #include <assert.h>
2+
3+ #ifdef __GNUC__
4+ // Will be implicitly invoked after main() completes if the attribute is
5+ // properly supported
6+ __attribute__((destructor ))
7+ #endif
8+ void assert_false (void )
9+ {
10+ assert (0 );
11+ }
12+
13+ int main ()
14+ {
15+ #ifndef __GNUC__
16+ // explicitly invoke assert_false as __attribute__((destructor)) isn't
17+ // supported in non-GCC modes
18+ assert_false ();
19+ #endif
20+ }
Original file line number Diff line number Diff line change 1+ CORE
2+ main.c
3+
4+ ^\[assert_false.assertion.1\] line 10 assertion 0: FAILURE$
5+ ^VERIFICATION FAILED$
6+ ^EXIT=10$
7+ ^SIGNAL=0$
8+ --
9+ ^warning: ignoring
Original file line number Diff line number Diff line change @@ -504,6 +504,26 @@ bool generate_ansi_c_start_function(
504504
505505 record_function_outputs (symbol, init_code, symbol_table);
506506
507+ // now call destructor functions (a GCC extension)
508+
509+ for (const auto &symbol_table_entry : symbol_table.symbols )
510+ {
511+ const symbolt &symbol = symbol_table_entry.second ;
512+
513+ if (symbol.type .id () != ID_code)
514+ continue ;
515+
516+ const code_typet &code_type = to_code_type (symbol.type );
517+ if (
518+ code_type.return_type ().id () == ID_destructor &&
519+ code_type.parameters ().empty ())
520+ {
521+ code_function_callt destructor_call (symbol.symbol_expr ());
522+ destructor_call.add_source_location () = symbol.location ;
523+ init_code.add (std::move (destructor_call));
524+ }
525+ }
526+
507527 // add the entry point symbol
508528 symbolt new_symbol;
509529
You can’t perform that action at this time.
0 commit comments