Path: utzoo!attcan!utgpu!jarvis.csri.toronto.edu!mailrus!uwm.edu!uakari.primate.wisc.edu!xanth!mcnc!rti!bdrc!jcl From: jcl@bdrc.UUCP (John C. Lusth) Newsgroups: comp.lang.c Subject: lint vs varargs Keywords: casts lint varargs Message-ID: <453@bdrc.UUCP> Date: 25 Oct 89 18:35:18 GMT Organization: Becton Dickinson Rsrch Cntr, RTP, NC Lines: 55 I have a lint question. Why does lint complain about varargs stuff? For example: 1: #include 2: #include 3: 4: main () 5: 6: { 7: (void) error ("hello world, says %s\n", "john"); 8: } 9: 10: error (va_alist) 11: 12: va_dcl 13: 14: { 15: va_list ap; 16: char *format; 17: 18: va_start(ap); 19: format = va_arg(ap, char *); 20: (void) vprintf (format, ap); 21: va_end(); 22: 23: return 0; 24: } Plain old lint yields: test.c(19): warning: possible pointer alignment problem Linting this beastie with the -c option yields: test.c(18): warning: illegal pointer combination test.c(19): warning: illegal pointer combination test.c(19): warning: possible pointer alignment problem I'm using a SUN 4, Sun OS 4.0.3. I understand (sorta) the complaint on line 18, which I think, after macro expansion, casts a pointer to int to a pointer to char. On a system where int * is bigger than char * (are there any?), this would fail. On second thought, however, I just remembered that (pre-ANSI) char * is guaranteed to be the generic pointer (i.e. at least as wide as any other pointer). On line 19, we get a cast of a char * to a char **. No guarantee that char ** is as wide as char *, so I guess the complaint, while annoying, is valid. Would someone explain line 18 to me (and 19 if my reasoning is wrong)? ..and give me a hint on how to shut lint up? -- John C. Lusth, Becton Dickinson Research Center, RTP, NC, bdrc!jcl@mcnc