Dav*_*d M 4 .net mutation-testing mono.cecil
我现在正在玩变异测试.我正在研究的一个突变涉及交换参数,例如,我可能需要交换参数,Ldarg.0
并Ldarg_S
使用指示索引的操作数.
这个操作数类型是一个内联arg,在Mono.Cecil中我认为需要我创建一个正确实例化ParameterDefinition
来存储32位int索引.有没有人有丝丝足够的经验,指出我的一个简单的方法正确的方向,以创建一个Instruction
与实例OpCode
的Ldarg_S
和Operand
适当的类型?
这里有两种操作码ldarg.0
,和ldarg
(及其_s)变体.
第一个是"宏"操作码,这意味着它用于减少通常使用的值的代码大小.
如果您需要修改方法的参数,我建议您将所有宏操作码转换为完整形式,这是使用辅助库Mono.Cecil.Rocks中的SimplifyMacros()
扩展方法完成的MethodBody
:
using Mono.Cecil;
using Mono.Cecil.Cil;
using Mono.Cecil.Rocks;
// ..
method.Body.SimplifyMacros();
Run Code Online (Sandbox Code Playgroud)
完成此操作后,现有ldarg.0
指令现在将ldarg
带有正确的操作数,正如您所猜测的那样,a ParameterDefinition
.
有了这些,您可以重新排序参数,并创建新的说明:
var il = method.Body.GetILProcessor();
var instruction = il.Create(OpCodes.Ldarg, aParameterDefinition);
il.InsertBefore(xxx, instruction);
Run Code Online (Sandbox Code Playgroud)
当你做,你可以调用的倒数SimplifyMacros()
,OptimizeMacros()
,这将尝试,好了,如果可能的优化操作码转换成他们的宏观形式.
你必须要注意的一件事是,实例方法的第一个参数,隐含的"this",用method.Body.ThisParameter
特殊的参数表示,你不会在方法的.Parameters集合中找到它.