From: "Eregon (Benoit Daloze)" Date: 2022-03-09T12:48:08+00:00 Subject: [ruby-core:107805] [Ruby master Feature#18615] Use -Werror=implicit-function-declaration by default for building C extensions Issue #18615 has been updated by Eregon (Benoit Daloze). shyouhei (Shyouhei Urabe) wrote in #note-6: > Mmm... Rubygems' hiding compiler warnings is the root cause of this problem, meseems. I think it is not the root cause, because even if RubyGems showed compiler warnings the relevant warning could easily be buried in the middle of many other warnings, or missed by Ruby users not so familiar with C warnings. Also I imagine most people doing `bundle install` wouldn't want to see some very minor C linting/no-big-deal warnings as it'd just be noise. It also seems hard to only show C compiler warnings and not pages of compilation output as well. So the only real fix IMHO is to fail at compilation time for implicit-function-declaration, otherwise it'd still fail at runtime (even if the warning is printed). Also in practice I think it would be hard for most users to make the connection between the C warning to the runtime error (compilation output might be in some other terminal or done way before, etc). > Implicit function declaration is a bad idea today, but worked nonetheless before. Yes, but it seems the perception on this evolved, notably with macOS or clang making it an error by default in recent versions. > I doubt if disabling it could break old extension libraries. Maybe, but I think such old extension libraries would have very little chance to work as any function using a non existing function would abort the whole process. ---------------------------------------- Feature #18615: Use -Werror=implicit-function-declaration by default for building C extensions https://bugs.ruby-lang.org/issues/18615#change-96733 * 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: