EU::Constant: avoid 'uninit' warning
authorDavid Mitchell <davem@iabyn.com>
Mon, 15 Dec 2014 16:14:13 +0000 (16:14 +0000)
committerNicholas Clark <nick@ccl4.org>
Tue, 8 Aug 2017 13:22:05 +0000 (15:22 +0200)
The code generated by ExtUtils::Constant can look something like:

static int
constant (..., IV *iv_return) {
   switch (...) {
     case ...:
       *iv_return = ...;
       return PERL_constant_ISIV;
     ...
  }
}

{
    int type;
    IV iv;
    type = constant(..., &iv);
    switch (type) {
        case PERL_constant_ISIV:
            PUSHi(iv);
    ...
    }
}

and the compiler isn't clever enough to realise that the value of iv
is only used in the code path where its been set.

So initialise it to zero to shut gcc up. Ditto nv and pv.

cpan/ExtUtils-Constant/lib/ExtUtils/Constant.pm

index 0dc9258..cf0e1ca 100644 (file)
@@ -198,17 +198,17 @@ $XS_subname(sv)
 EOT
 
   if ($params->{IV}) {
-    $xs .= "   IV              iv;\n";
+    $xs .= "   IV              iv = 0; /* avoid uninit var warning */\n";
   } else {
     $xs .= "   /* IV\t\tiv;\tUncomment this if you need to return IVs */\n";
   }
   if ($params->{NV}) {
-    $xs .= "   NV              nv;\n";
+    $xs .= "   NV              nv = 0.0; /* avoid uninit var warning */\n";
   } else {
     $xs .= "   /* NV\t\tnv;\tUncomment this if you need to return NVs */\n";
   }
   if ($params->{PV}) {
-    $xs .= "   const char      *pv;\n";
+    $xs .= "   const char      *pv = NULL; /* avoid uninit var warning */\n";
   } else {
     $xs .=
       "        /* const char\t*pv;\tUncomment this if you need to return PVs */\n";