From: "Eregon (Benoit Daloze)" Date: 2022-03-10T13:08:47+00:00 Subject: [ruby-core:107823] [Ruby master Feature#18615] Use -Werror=implicit-function-declaration by default for building C extensions Issue #18615 has been updated by Eregon (Benoit Daloze). That would maybe help for that specific function and nothing else. It seems fairly straightforward that in 2022 `-Werror=implicit-function-declaration` should be the default for all C programs (and clang/macOS seem to think the same). It's a clear bug in the source code and should never compile: it can lead to bugs or I think even security issues like reading random memory (due to passing the wrong argument type, when the function does exist). The fact it was not an error from the start is probably legacy C compiler behavior, which seems no longer relevant today. This also helps gem authors, now instead of potentially missing a warning (e.g., because there are other warnings, some maybe not in their control from 3rd party sources) which can cause their gem to fail at runtime, it fails at compile time and tell them their gem won't work until they fix that issue. I believe we are helping no one by making such a bug fail at runtime. It seems just sanity when developing C code, really. ---------------------------------------- Feature #18615: Use -Werror=implicit-function-declaration by default for building C extensions https://bugs.ruby-lang.org/issues/18615#change-96752 * 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). EDIT: `-Werror=implicit-function-declaration` is now default for building CRuby, but not for C extensions. How about we just always enable `-Werror=implicit-function-declaration` for all 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 runtime * never compiles a call in C with the wrong type due to a missing include From https://github.com/oracle/truffleruby/issues/2618 -- https://bugs.ruby-lang.org/ Unsubscribe: