【发布时间】:2020-12-01 10:45:16
【问题描述】:
鉴于以下分支指令的相同属性(来自microsoft):
- blt:效果与执行 clt 指令后跟 brtrue 分支到特定目标指令的效果相同。
- bgt:效果与执行 cgt 指令后跟 brtrue 分支到特定目标指令的效果相同
- bge:效果与执行 clt 指令(用于浮点数的 clt.un)后跟 brfalse 分支到特定目标指令的效果相同。
- beq:效果与执行 ceq 指令后跟 brtrue 分支到特定目标指令的效果相同。
事实证明,编译器通常会通过将诸如“
我需要特定的 C# 示例生成始终分支运算符 (blt/bgt/bge/beq) 或始终比较运算符 (clt/cgt/clt/ceq) 后跟分支 true。我的应用程序测试需要能够在此 IL 代码上断言。
我的尝试:
- 添加
[MethodImpl(MethodImplOptions.NoOptimization | MethodImplOptions.NoInlining)] - If/while/for/do-while/switch 操作,但对我来说都是比较运算符。
- 尝试了多种示例,但未能成功生成一个简单的 if,导致使用了分支运算符。
用例
我使用单元测试将 C# 文件编译成程序集,然后这些测试搜索某个操作码 (clt) 并找到可能的逆操作码 (cgt)。这是测试我编写的 C#-mutation 测试工具所必需的。这个变异工具在字节级别上对 dll 代码进行变异(反转运算符)。在 C# 源代码级别我们使用 '
资源
- 微软操作码documentation
- 操作码含义列表documentation
- 使用 IL-spy/Dn-spy 等工具检查 IL 生成的指令。
【问题讨论】:
-
如果您需要特定的 IL 序列,为什么要强制 C# 编译器生成它们而不是自己显式生成它们?
-
不用担心 IL -- 不用担心 JIT 生成的 ASM
-
我使用单元测试将 C# 文件编译成程序集,然后他们搜索某个操作码 (clt) 并找到可能的逆操作码 (cgt)。这是测试我编写的 C#-mutation 测试工具所必需的。这个变异工具会在字节级别上对 dll 代码进行变异。
-
因此,您正在对适用于 IL 的工具进行单元测试,并且您想说服编译器输出特定的 IL 序列?不要那样做——这非常依赖于编译器版本。发出你想自己测试的 IL 序列
-
@canton7 也许这就是我可以在这里做的。我可以编写一些逻辑来确保存在正确的 IL 代码。因此,如果我无法在生成时确定输出 IL 代码,我认为这将是一件好事。