From: "Eregon (Benoit Daloze)" Date: 2022-03-08T13:11:20+00:00 Subject: [ruby-core:107796] [Ruby master Feature#18615] Use -Werror=implicit-function-declaration by default for building C extensions Issue #18615 has been updated by Eregon (Benoit Daloze). Actually compiling CRuby itself already uses `-Werror=implicit-function-declaration` (https://github.com/ruby/ruby/blob/1adc7aa630d43e04cf5e75bbbbcf48b72a6e6c45/configure.ac#L650), but that's downgraded to `-Wimplicit-function-declaration` for C extensions. It should be `-Werror=implicit-function-declaration` for C extensions too. ---------------------------------------- Feature #18615: Use -Werror=implicit-function-declaration by default for building C extensions https://bugs.ruby-lang.org/issues/18615#change-96720 * Author: Eregon (Benoit Daloze) * Status: Open * Priority: Normal ---------------------------------------- Currently, if a C extension refers a non-existing function it will continue to compile and only emit a warning. And compilation warnings are hidden by default for both `gem install` and `bundle install` (`gem install -V somegem` shows them). A concrete example is the sqlite3 gem, if we use version 1.3.13 it fails only at runtime: ``` $ gem install sqlite3:1.3.13 Fetching sqlite3-1.3.13.gem Building native extensions. This could take a while... Successfully installed sqlite3-1.3.13 1 gem installed $ ruby -rsqlite3 -e 'db = SQLite3::Database.new "test.db"; p db' ruby: symbol lookup error: /home/eregon/.rubies/ruby-3.0.2/lib/ruby/gems/3.0.0/gems/sqlite3-1.3.13/lib/sqlite3/sqlite3_native.so: undefined symbol: rb_check_safe_obj ``` This is not nice, it should have failed clearly at compile time, saying the function does not exist. There is a compiler warning, which can only be seen with (and so most users would miss it): ``` $ gem install -V sqlite3:1.3.13 ... database.c: In function ���initialize���: database.c:60:3: warning: implicit declaration of function ���rb_check_safe_obj���; did you mean ���rb_check_safe_str���? [-Wimplicit-function-declaration] 60 | rb_check_safe_obj(file); | ^~~~~~~~~~~~~~~~~ | rb_check_safe_str ... ``` Also multiple CRuby releases are broken on macOS which seems to enable `-Werror=implicit-function-declaration` by default (e.g., #17777). How about we just always enable `-Werror=implicit-function-declaration` by default? For everything so CRuby and C extensions (builtin or not). It: * shows clear errors early on and shows where the missing function is called (explained just above), instead of delaying them to link time * never compiles a call in C with the wrong type due to a missing include * avoids issues with compiling CRuby on macOS From https://github.com/oracle/truffleruby/issues/2618 -- https://bugs.ruby-lang.org/ Unsubscribe: