Summary

bind: scrutinizer problem with passing along void result type

Metadata

Description

The scrutinizer run of Salmonella found a problem with the "random-mtzig" egg, which turns out to be caused by a (small) bug in the bind egg: http://parenteses.org/mario/misc/specialize-report/install/random-mtzig.html

A simple test:

 (use srfi-4 bind)
 
 (foreign-declare "void foo(unsigned int *x, int y) { printf(\"%d %d\\n\", x[1], y); }")
 
 (bind* "void foo(unsigned int *x, ___length(x) int y);")

When compiling this with -scrutinize, I get a similar warning:

 Warning: in toplevel procedure `foo':
   access to variable `g27' which has an undefined value

This is due to the fact that the make-inout-wrapper helper procedure rewrites to a let form which returns its value. If that's a void type, it returns this "undefined" value, which triggers a scrutiny warning. I'm unsure whether this is actually correct (why would it be a bug to just pass on a value? Using it as an argument to another procedure would be an actual problem)

If this is indeed to be considered a scrutiny bug, please close this ticket and make a new one for Chicken.

Meanwhile, here's a patch for bind if it's to be considered a bind bug:

 Index: bind-translator.scm
 ===================================================================
 --- bind-translator.scm (revision 26708)
 +++ bind-translator.scm (working copy)
 @@ -895,7 +895,9 @@
                           (list tmp) ) 
                     ,@(filter-map (lambda (rvar io) (and (memq io '(out inout)) rvar))
                                   results io) )
 -                 tmp) ) )
 +                 (if (eq? rtype 'void)
 +                      '(void)
 +                      tmp)) ) )
         `(,rname ,@vars) ) ) )
  
  (define (length-procedure t)

Changes and comments

[2012-06-28 14:08:19 UTC] felix changed status from new to closed

[2012-06-28 14:08:19 UTC] felix set resolution to fixed

[2012-06-28 14:08:19 UTC] felix wrote:

I have disabled this warning in the scrutinizer. Accessing a variable with undefined value is completely ok, as long as the value is not used for anything.