Deutsch English Français Italiano |
<86le5zipzo.fsf@linuxsc.com> View for Bookmarking (what is this?) Look up another Usenet article |
Path: ...!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!.POSTED!not-for-mail From: Tim Rentsch <tr.17687@z991.linuxsc.com> Newsgroups: comp.lang.c Subject: Re: Casting the return value of ... Date: Sat, 30 Mar 2024 10:33:31 -0700 Organization: A noiseless patient Spider Lines: 57 Message-ID: <86le5zipzo.fsf@linuxsc.com> References: <uu416t$33u55$1@news.xmission.com> <20240328105203.773@kylheku.com> <K0jNN.158579$zF_1.100106@fx18.iad> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Injection-Date: Sat, 30 Mar 2024 17:33:34 +0100 (CET) Injection-Info: dont-email.me; posting-host="8552662d97416c03078d7b971fbb1163"; logging-data="1197312"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX1+yY/TmzqbZGgOGSWzhTxMYyIOj9F9/rm8=" User-Agent: Gnus/5.11 (Gnus v5.11) Emacs/22.4 (gnu/linux) Cancel-Lock: sha1:ySb8D4zaRWuTnUgL4wfWsrgU/s0= sha1:5LHXmmhlhgaQC48+znPAxoaiIXI= Bytes: 3285 scott@slp53.sl.home (Scott Lurndal) writes: > Kaz Kylheku <433-929-6894@kylheku.com> writes: > >> On 2024-03-28, Kenny McCormack <gazelle@shell.xmission.com> wrote: >> >>> But here's the thing. Is the casting of the result of dlsym() >>> [to a function pointer type] necessary? >>> Isn't this the same as "casting the return value of malloc()", where you >> >> Conversions between function pointers and data pointers are an >> extension; it is not well-defined behavior in ISO C. >> >> I also seem to remember something like this, but I cannot trust this >> documentation without a chapter-and-verse citation. > > https://pubs.opengroup.org/onlinepubs/9699919799/functions/dlsym.html > >> Assuming it is true, there you have it; if you're on POSIX, the compiler >> is required to have the extension and it is connected to casting, >> in which case the cast is required. > > I've used this form for the last two decades, with gcc, with no > issues: > > /** > * Each shared object that simulates a Data Link Processor (DLP), will > * contain a single namespace-scope function <b>get_dlp</b> which constructs > * a DLP object of the specified type (for example, a #c_uniline_dlp, > * #c_card_reader_dlp, et alia). <b>get_dlp</b> returns the constructed > * object as a #c_dlp object to the #channel function, which is then used > * by the I/O subsystem to request services of the DLP at the MLI level. > */ > typedef c_dlp* (*get_dlp_t)(const char *, uint64_t, c_logger *); > ... > get_dlp_t sym; > ... > > sym = (get_dlp_t)dlsym(handle, "get_dlp"); > if (sym == NULL) { > lp->log("Invalid DLP shared object format: %s\n", dlerror()); > unregister_handle(channel); > dlclose(handle); > return 1; > } > > >> I think there was a time in the development of GCC when there was >> a warning even with the cast. I don't think it's enabled by default >> now? > > We compile with -Wall -Werror and have never seen any warnings related to > casting the result of dlsym(), and we build with GCC[4..13]. Do you use -pedantic? Compiling with -pedantic using gcc 8.4.0 gives a warning diagnostic (and a fatal error if -pedantic-errors is specified in place of -pedantic).