"Semantic issue: Implicitly declaring library function 'malloc' with type 'void *(unsigned long)'"
Asked Answered
C

1

23

I have a block of code where I'm trying to grab an expression inside of parentheses and then use it. At the point where the below code begins, I am in the middle of iterating through a character array and pcc is the pointer to the current character, which has been determined to be a '('. My goal is to put the paranthetical expression in a character array pe.

            int nnrp = 1; /* Net number of right parantheses */
            char * pbpe = pcc; /* Pointer to the beginning paranthetical expression */
            for (++pcc; *pcc!= '\0' && nnrp != 0; ++pcc)
            {
                if (*pcc == '(')
                {
                    ++nnrp;
                }
                else if (*pcc == ')')
                {
                    --nnrp;
                }
                else if (*pcc == '\0')
                {
                    sprintf(err, "Unbalanced paranthesis");
                    return -1;
                }
            }
            /* If we're here, *pcc is the closing paranathesis of *pbpe */
            long nel = pcc - pbpe; /* New expression length */
            if (nel == 1)
            {
                sprintf(err, "Empty parenthesis");
                return -1;
            }
            char * pe = (char*)malloc(nel+1); /* Paranthetical expression */
            strncpy(pcc+1, pcc, nel);
            pe[nel] = '\0';

But my IDE (XCode 6.0) is giving me the warning

"Semantic issue: Implicitly declaring library function 'malloc' with type 'void *(unsigned long)'"

on the strncpy(pcc+1, pcc, nel); line. I'm wondering

  1. why I'm getting this warning.
  2. whether I need to fix it
  3. if there are any other problems you can see in my code.

Thanks in advance.

Cung answered 23/2, 2015 at 3:20 Comment(2)
I'd have expected that implicit declaration to be of type int (long) rather than void *(unsigned long)... Curious: Which compiler (of which version and with which options) is this?Cachet
Clang gives this warning, with both -std=c89 and -std=c99. This is not the traditional way of implicit function declarations (which was linked below), Clang chooses the correct declaration of malloc and emits a warning (required by C99; in C89, the code is simply undefined). Interesting.Cachet
C
61

Try adding this line to the top of your file:

#include <stdlib.h>

This will bring in the explicit declaration of malloc, so you shouldn't get that warning.

You are probably getting a warning because you forgot to include stdlib.h in your file. The compiler is being nice to you and giving you an implicit declaration of malloc so that the code will compile. In general, it's better to include the explicit declaration so that the compiler really knows what kind of function you are trying to call, and it's also good to fix all the warnings that you can so that your build process will be clean and you can notice the more important warnings. So yes, you should fix it.

Cooky answered 23/2, 2015 at 3:29 Comment(3)
@LilyCarter: you should also remove the (char *) cast from the malloc call; it isn't necessary, and under older compilers will suppress a useful diagnostic if you forget to include stdlib.h or otherwise don't have a declaration for malloc in scope. Note that in C++ the cast is required, but if you're writing C++ you should be using the new operator instead of malloc.Nic
in C a cast shouldn't be used. And the implicit declaration is also explained in that questionCrocoite
I had the same problem. #include <stdlib.h> did not solve the problem for me, but #include <string.h> did.Dipetalous

© 2022 - 2024 — McMap. All rights reserved.