Hi Bruno! Bruno Haible <[email protected]> writes:
> in C++, it is easier and more robust to define GNULIB_NAMESPACE. OK, thanks, I'll progress this way. >> /usr/sbin/../lib64/gcc/x86_64-pc-linux-gnu/10.2.0/../../../../include/c++/10.2.0/bits/basic_string.h:6652:50: >> error: The symbol ::vsnprintf refers to the system function. Use >> gnulib::vsnprintf instead. [-Werror,-Wuser-defined-warnings] > > You decide whether to follow this suggestion. If you follow it, this warning > will disappear. If you don't follow it, at the end of going through all > warnings, you add '-Wno-user-defined-warnings' to your CPPFLAGS, and are done > with it. I have a few questions about this: - Would it be possible to provide a way to disable only the warnings emitted by _GL_CXXALIASWARN? (or maybe one of the macro it calls, I don't know where is the right place) Removing all user-defined warnings with -Wno-user-defined-warnings will hide other important messages. For instance libc++ uses diagnose_if attributes to warn about some common C++ errors. They even provide a _LIBCPP_DISABLE_ADDITIONAL_DIAGNOSTICS macro to disable those. (this macro appears on https://libcxx.llvm.org/docs/UsingLibcxx.html) - Is there a way to detect that the function is being called in a system header and use that in the diagnose_if condition? If possible, that would allow removing some false positives. In the case I reported, the warning about vsnprintf is in a system-header on a system where @REPLACE_VSNPRINTF@=0, so the warning is clearly noisy. - Do I understand correctly that those warnings are supposed to be emitted everywhere I forgot to use the gnulib:: namespace before the call of a replaceable function? Even on systems where no replacement function is used? I did not see any such warning when I first compiled with g++ and GNULIB_NAMESPACE, and after reading the "drawback" paragraph near the end of page https://www.gnu.org/software/gnulib/manual/html_node/A-C_002b_002b-namespace-for-gnulib.html I assumed I was on my own to find all the places where gnulib:: should be added. It's only when some continuous integration builds failed that I discovered that clang++ would emit warnings [*]. Having now looked at _GL_CXXALIASWARN it seems the warnings are disabled when GCC optimizes, which is the default with Autoconf. May this page could mention that some built-in help is available, and how to get it. Something like: To help with finding function names that should be prefixed by gnulib::, Gnulib equips the original functions in the global namespace with an attribute that will trigger warnings when those functions are called. This only works with g++ when not optimizing (-O0), or with clang++, so you may want to give one of these two compilers a go after you activate GNULIB_NAMESPACE. [*] I would have not noticed those warnings if those builds were not setup with -Werror. That's one reason why I try to get warning-less builds: so that I do not miss useful messages that appear only in some build configurations. Another reason is that I build a library; I want the headers I install to follow the strictest standard I can, so that users of those headers are not annoyed by warnings I could have avoided. (Obviously I'm not installing the gnulib headers, so I have a bit more freedom here.) -- Alexandre Duret-Lutz
