On Fri, Oct 19, 2012 at 10:59 AM, Basile Starynkevitch <bas...@starynkevitch.net> wrote: > On Fri, Oct 19, 2012 at 10:26:58AM +0200, Richard Biener wrote: >> On Thu, Oct 18, 2012 at 10:33 PM, Basile Starynkevitch >> <bas...@starynkevitch.net> wrote: >> > Hello >> > >> > I'm coding in MELT the ex06/ of https://github.com/bstarynk/melt-examples/ >> > which should typecheck calls to variadic functions json_pack & json_unpack >> > from http://www.digip.org/jansson (a JSON library in C). >> > >> > I'm working on a MELT pass on Gimple/SSA after phiopt (maybe that place is >> > wrong?) >> > >> > I don't understand well how to check that a given Gimple argument is a >> > string. >> > I was thinking of using useless_type_conversion_p or types_compatible_p on >> > the TREE_TYPE of some POINTER_TYPE with char_type_node, but it seems to >> > not work as I would expect >> > >> > How would you (in C++ or C for a 4.6) code such a test (that argument 2 of >> > some GIMPLE_CALL is a string, ie. a char* in C parlance)? >> >> You would look at the function signature of the function called, not at its >> argument. The argument can be a void * and still be a "string" (well, a >> pointer >> to a string). GIMPLE doesn't care about the actual type pointed to. > > GCC is using the syntactic type of the argument for printf. The following code > void f (char *s) > { printf ("%s\n", (void *) s); } > gives when compiled with gcc -Wall > f.c:4:1: warning: format ‘%s’ expects argument of type ‘char *’, but > argument 2 has type ‘void *’ [-Wformat] > and we are in the case where the argument is a string casted to (void*); I > don't want to give more clever warnings.
The format warnings are output from the frontend which does not have GIMPLE. > So I don't follow you. I want to typecheck (at least in the common simple > cases) the calls to that variadic function. > I don't care that much about its signature. > > To be concrete, <jansson.h> declares > json_t *json_pack(const char *fmt, ...); > > and the documentation > http://www.digip.org/jansson/doc/2.4/apiref.html#building-values > suggests that > /* Create the JSON integer 42 */ > json_pack("i", 42); > /* Create the JSON array ["foo", "bar", true] */ > json_pack("[ssb]", "foo", "bar", 1); > > I just want to extend GCC (thru a MELT extension, but that could be a GCC > plugin in C++) to detect > incorrect calls like > > json_pack("i", /*that should be an int:*/ 3.14); > or > json_pack("[ss]", "foo", /* that should be a string*/ 3 > /*and the arity is wrong an argument is missing*/); > > I believe I should use > extern bool useless_type_conversion_p (tree, tree); > from gcc/gimple.h (it is funny that function is in gimple.h, I would expected > it to be in tree.h) > with one of the argument being char_type_node the predicate is only valid on GIMPLE, not on GENERIC. GIMPLE ignores all non-value-changing conversions while GENERIC does not. > But I might have trouble in using it. Indeed you will experience that it might do something sensible for simple testcases. But as I said above, you will not reliably be able to distinguish a valid char * pointer from an invalid int * pointer just by looking at the pointer type. Richard. > Thanks for reading. Regards. > -- > Basile STARYNKEVITCH http://starynkevitch.net/Basile/ > email: basile<at>starynkevitch<dot>net mobile: +33 6 8501 2359 > 8, rue de la Faiencerie, 92340 Bourg La Reine, France > *** opinions {are only mines, sont seulement les miennes} ***