https://gcc.gnu.org/bugzilla/show_bug.cgi?id=86053

            Bug ID: 86053
           Summary: Builtin fwrite arguments have non_null attribute and
                    builtin function declaration not overloaded
           Product: gcc
           Version: 6.3.1
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
          Assignee: unassigned at gcc dot gnu.org
          Reporter: olivier at wuillemin dot fr
  Target Milestone: ---

Builtin fwrite arguments have non_null attribute and builtin function
declaration not overloaded

I'm compiling ARM embedded software using Atmel Studio 7 and Atmel toolchain
6.3.1.508 a package of ARM's gcc-arm-embedded project 6-2017-q2-update1.
Files functions (fopen, fread, fwrite...) are embedded in a specific <stdio>
module, weak libc stdio functions are overloaded.

1°/ Buitin fwrite function seems to have the 4th parameter (file handle) with
nonnull attribute.

Compile this code :

#include <stdlib.h>

int main(void)
{
  fwrite("Hello", 5, 1, NULL);
  fread(NULL, 5, 1, NULL);
}

For the fwrite line a warning is generated : 
  main.c (6,2): null argument where non-null required (argument 4) [-Wnonnull]"
For the fread line, no warning is generated.
Some others warnings  are without interest for this demonstration.

This warning is also generated using Codelite and TDM32 [gcc (tdm-1) 5.1.0].

Arm's toolchain stdio.h fwrite prototype doesn't have the nonnull attribute :
  size_t        _EXFUN(fwrite, (const _PTR __restrict , size_t _size, size_t
_n, FILE *));
TDM32's  toolchain stdio.h fwrite prototype doesn't have the nonnull attribute
:
_CRTIMP size_t __cdecl __MINGW_NOTHROW  fwrite (const void*, size_t, size_t,
FILE*);

- Is it normal that the builtin fwrite arguments have the non-null attribute ?
- Is it normal that read argument attibutes have not the same behaviour than
write ? 


2°/ Buitin fwrite prototype overload local fwrite declaration

Compile this code :

#include <stdlib.h>

typedef struct  {
  unsigned foo;
} FILE;

size_t fwrite(const void *ptr, size_t size, size_t n, FILE *stream)
{
  size_t lCount;

  lCount = 0;
  if (stream != NULL) {
    lCount = size * n;
  }
  return (size_t)lCount;
}

size_t fread(void *ptr, size_t size, size_t n, FILE *stream)
{
  size_t lCount;

  lCount = 0;
  if (stream != NULL) {
    lCount = size * n;
  }
  return (size_t)lCount;
}

int main(int argc, char **argv)
{

        fwrite("hello world\n", 5, 1, NULL);
        fread(NULL, 5, 1, NULL);

        return 0;
}

With ARM toolchain, 2 warnings are generated  :
One for the fwrite call :
  main.c(32,2): warning: null argument where non-null required (argument 4)
[-Wnonnull]
One for the the fwrite function :
  main.c(12,6): warning: nonnull argument 'stream' compared to NULL
[-Wnonnull-compare]

Local fwrite declaration has no nonnull attribute for 4th parameter and : 
  - a warning is generated at fonction call.
  - More strange is the warning generated inside the function itself. It's own
declaration is overload by builtin declaration. no effect.

Compiling the code with TDM32 generate only one warning at function call.

Compilers options are -O0 -Wall 

When using compiler option -fno-builtin, warnings disappear.

Best regards,

Olivier

Reply via email to