ruby/fiddle

Unreachable code path in Fiddle::ValueUtil#wrap_arg

Maumagnaguagno opened this issue · 5 comments

In Fiddle::ValueUtil#wrap_arg there is a long case-when for arg with an unreachable code path.
When arg and ty are of Array type, and ty[0] is TYPE_CHAR, there is another condition, for arg to be String at Line 101.
Even if this condition is fixed, val is undefined at Line 102 for this method.

fiddle/lib/fiddle/value.rb

Lines 95 to 106 in 04238ce

when Array
if( ty.is_a?(Array) ) # used only by struct
case ty[0]
when TYPE_VOIDP
return arg.collect{|v| Integer(v)}
when TYPE_CHAR
if( arg.is_a?(String) )
return val.unpack('C*')
end
end
end
return arg

Should Lines 100-103 be removed?

kou commented

Can you create a script that uses 101 and share it to us?

require 'fiddle/value'

c = Class.new.extend(Fiddle::ValueUtil)
p c.wrap_arg(['55','0'],[Fiddle::TYPE_VOIDP]) # Line  99
p c.wrap_arg(['test'],[Fiddle::TYPE_CHAR])    # Line 106
kou commented

Ah, could you use normal API instead of directly using wrap_arg? It seems that lib/fiddle/struct.rb uses wrap_arg.

Unfortunately I am not that familiar with Fiddle structs to make a valid minimal example to reach that point.
I just noticed the loose variable val and that arg needs to be both Array and String at the same time.

kou commented

OK.
I'll take a look at this later.