[sane-devel] [patch] fix SANE_Device

Oliver Rauch Oliver.Rauch@Rauch-Domain.DE
17 Nov 2004 22:23:36 +0100


--=-RUwrefXyfKzMY5rN2jAg
Content-Type: text/plain
Content-Transfer-Encoding: 7bit

Am Mit, 2004-11-17 um 20.58 schrieb fzago@austin.rr.com:
> > Hello Frank.
> > 
> > I am not a fan of this patch.
> > I think it will work but I think it is a hack.
> > 
> > It seems that only a few backends have problems with this.
> 
> A few backend are creating the name of the manufacturer from the scsi inquiry.
> A lot of backends are creating their mode list from the device.
> This patch will allow us to get rid of about 150 (IMO legitimate) warnings. The current code is not clean.
> 
> 
> > Why not fix it in a proper way:
> 
> The non hack solution is to have two headers: one for the symbols exported and one for internal use. Same as what is done with the linux kernel structure s.
> 
> > 
> > create the strings as non const and then set the
> > sane_device structur to point to these strings?!
> 
> This will not work. That why there is so much warnings.

IMO thats not ture.
It is allowed to do this:

	char *hello;
	const char *hello_const;

 	  hello="ABC";

	  hello_const = hello;



and this produces a warning:

	  *hello_const = 'A';

what is correct becaus we use a pointer to a const char to change the
char so it is not const any more.

It is not a const pointer to a char, it is a pointer to a const char.
And it is allowed to make a pointer of type pointer to const char point
to a (non const) char.

I attach a little test c-code for this. Compile with

gcc consttest.c -o consttest -Wall

(gcc version 3.2.2 20030222)

Oliver

> 
> > 
> > But when I am the only one who is against this patch
> > then I will be quiet and it will be ok for me. It is nothing
> > that will steal my sleep :)
> > 
> 
> Your input is appreciated. Thanks.
> 
> Frank.
> 
> 
> 
> 

--=-RUwrefXyfKzMY5rN2jAg
Content-Disposition: attachment; filename=consttest.c
Content-Type: text/x-c; name=consttest.c; charset=UTF-8
Content-Transfer-Encoding: 7bit

#include "stdio.h"
#include "stdlib.h"

int main()
{
 const char *hello_const;
 char *hello;

  printf("defining hello=\"Hello\"\n");
  printf("defining hello_const = hello\n");
  hello = "Hello";
  hello_const = hello;
  printf("hello = %s\n", hello);
  printf("hello_const = %s\n", hello_const);
  printf("\n");

  printf("defining hello = (char *) malloc(10)\n");
  printf("defining *hello = \'A\'\n");
  printf("defining *(hello+1) = \'B\'\n");
  printf("defining hello_const = hello\n");
  hello= (char *) malloc(10);
  hello_const = hello;
  *hello='A';
  *(hello+1)='B';
  hello[2]=0;
  printf("hello = %s\n", hello);
  printf("hello_const = %s\n", hello_const);
  printf("\n");

  printf("unallowed defining *hello_const = \'X\'\n");
  *hello_const='X';

  printf("hello = %s\n", hello);
  printf("hello_const = %s\n", hello_const);

 return 0;
}

--=-RUwrefXyfKzMY5rN2jAg--