如何从这段代码中绘制控制流图?
How to draw a Control Flow Graph from this code?
int main() {
int i, grade = 0;
printf (" Enter points: \n");
scanf ("%d", &i);
if (i >= 50 && i <= 60) grade = 5;
else if (i > 50 && i <= 60) grade = 6;
else if (i > 60 && i <= 70) grade = 7;
else if (i > 70 && i <= 80) grade = 8;
else if (i > 80 && i <= 90) grade = 9;
else if (i > 90 && i <= 100) grade = 10;
char sign = ' ';
if (grade) {
int p = i % 10;
if (grade != 5) {
if (p >= 1 && p <= 3)
sign = '-';
else if (grade != 10 && (p >= 8 || p == 0))
sign = '+';
}
printf (" The grade is %d%c. \n", grade, sign);
}
return 0;
}
如何从这段代码中绘制控制流图?如果有人能展示这个过程,我将不胜感激。我可以从一个非常简单的案例中得出 CFG,但我做不到这个。我还需要确定多条件标准的基本路径和测试。不是作业题,我只是试着理解课程material。谢谢
如果我们应该解释流程图,那我们为什么要画它?图表一定很清楚。
有很多在线工具,您可以输入您的代码,它们会给您这样的图表。
你可以查看 this.
这是维基百科对 CFG 的定义,我知道你已经知道了,但为了完整起见,我把它放在这里
A control flow graph (CFG) in computer science is a representation,
using graph notation, of all paths that might be traversed through a
program during its execution.
参考:https://en.wikipedia.org/wiki/Control_flow_graph
以下是Path的定义
Path: a sequence of node on the CFG (static), including an entry node
and an exit node; path segment: a subsequence of nodes along the path
参考:http://web.cs.iastate.edu/~weile/cs513x/4.ControlFlowAnalysis.pdf
所以绘制一个的原因是确定程序采用的所有可能路径,这可能有助于我们确定诸如测试覆盖率之类的事情,而无需实际 运行 运行程序(静态分析)。
以下是我们绘制 CFG 时可以遵循的简单规则
- 任何语句都是图中的一个节点
- 所有节点都有一条有向边到达它们或离开它们或两者都有。入口节点(第一条语句)只有传出边,出口节点只有传入边。
- 只有像
if/else if
、switch
、loops
这样的条件语句会有多个输出边。
- 从一个节点出来的所有路径都会在某个点收敛,在最坏的情况下它们会在出口处收敛。
这是一个作弊 sheet 解释得更好
现在让我们将程序中的每个语句映射到我们将用来表示 CFG 节点的数字
int main() {
1. int i, grade = 0;
2. printf (" Enter points: \n");
3. scanf ("%d", &i);
4. if (i >= 50 && i <= 60)
5. grade = 5;
6. else if (i > 50 && i <= 60)
7. grade = 6;
8. else if (i > 60 && i <= 70)
9. grade = 7;
10. else if (i > 70 && i <= 80)
11. grade = 8;
12. else if (i > 80 && i <= 90)
13. grade = 9;
14. else if (i > 90 && i <= 100)
15. grade = 10;
16. char sign = ' ';
17. if (grade) {
18. int p = i % 10;
19. if (grade != 5) {
20. if (p >= 1 && p <= 3)
21. sign = '-';
22. else if (grade != 10 && (p >= 8 || p == 0))
23. sign = '+';
}
24. printf (" The grade is %d%c. \n", grade, sign);
}
25. return 0;
}
这是按照上面作弊 sheet 图表中的指示创建的输出。请注意,节点 16 和 24 之前作为许多条件节点的连接节点。
致谢:我已使用 draw.io 创建上面发布的图像。
注意:绘制CFG的秘诀是将每个语句独立于程序,绘制它然后link它是其余部分的入口和出口图。
以下是我遵循的几个初始步骤
- 语句 1、2 和 3 是非条件语句,因此我创建了三个块 link 将它们放在一起。
- 语句 4 是条件语句。所以我必须为它创建 4 个块。第一个用于语句 4,第二个和第三个用于 TRUE、FALSE 边,最后一个用于 JOIN 节点。如果为真则语句 5 是 运行 如果不是则我们转到语句 6。从语句 5 我们直接转到语句 16,这是我们的连接节点。最后我们 link 阻止 4 以阻止 3 的出边。
- 现在语句 6 本身是一个条件语句,所以我们再次需要 4 个块。我们已经有了自己的第 6 块。加入节点,因为它将是语句 16,就好像它的条件为真,然后语句 7 是 运行,它直接转到 16。现在我们已经有了块 6 和 16,所以我们只是需要语句 7 和 8 的 TRUE、FALSE 分支块。
等等,我们不断检查适用节点的作弊 sheet 并隔离创建它们,然后 link 然后与之前的节点一起创建。
我的 C 前端工具 Crokus(在两者上都可用 github and rubygems)直接通过解析你的 C 代码来提供。
int main() {
int i, grade = 0;
printf (" Enter points: \n");
scanf ("%d", &i);
if (i >= 50 && i <= 60) grade = 5;
else if (i > 50 && i <= 60) grade = 6;
else if (i > 60 && i <= 70) grade = 7;
else if (i > 70 && i <= 80) grade = 8;
else if (i > 80 && i <= 90) grade = 9;
else if (i > 90 && i <= 100) grade = 10;
char sign = ' ';
if (grade) {
int p = i % 10;
if (grade != 5) {
if (p >= 1 && p <= 3)
sign = '-';
else if (grade != 10 && (p >= 8 || p == 0))
sign = '+';
}
printf (" The grade is %d%c. \n", grade, sign);
}
return 0;
}
如何从这段代码中绘制控制流图?如果有人能展示这个过程,我将不胜感激。我可以从一个非常简单的案例中得出 CFG,但我做不到这个。我还需要确定多条件标准的基本路径和测试。不是作业题,我只是试着理解课程material。谢谢
如果我们应该解释流程图,那我们为什么要画它?图表一定很清楚。
有很多在线工具,您可以输入您的代码,它们会给您这样的图表。 你可以查看 this.
这是维基百科对 CFG 的定义,我知道你已经知道了,但为了完整起见,我把它放在这里
A control flow graph (CFG) in computer science is a representation, using graph notation, of all paths that might be traversed through a program during its execution.
参考:https://en.wikipedia.org/wiki/Control_flow_graph
以下是Path的定义
Path: a sequence of node on the CFG (static), including an entry node and an exit node; path segment: a subsequence of nodes along the path
参考:http://web.cs.iastate.edu/~weile/cs513x/4.ControlFlowAnalysis.pdf
所以绘制一个的原因是确定程序采用的所有可能路径,这可能有助于我们确定诸如测试覆盖率之类的事情,而无需实际 运行 运行程序(静态分析)。
以下是我们绘制 CFG 时可以遵循的简单规则
- 任何语句都是图中的一个节点
- 所有节点都有一条有向边到达它们或离开它们或两者都有。入口节点(第一条语句)只有传出边,出口节点只有传入边。
- 只有像
if/else if
、switch
、loops
这样的条件语句会有多个输出边。 - 从一个节点出来的所有路径都会在某个点收敛,在最坏的情况下它们会在出口处收敛。
这是一个作弊 sheet 解释得更好
现在让我们将程序中的每个语句映射到我们将用来表示 CFG 节点的数字
int main() {
1. int i, grade = 0;
2. printf (" Enter points: \n");
3. scanf ("%d", &i);
4. if (i >= 50 && i <= 60)
5. grade = 5;
6. else if (i > 50 && i <= 60)
7. grade = 6;
8. else if (i > 60 && i <= 70)
9. grade = 7;
10. else if (i > 70 && i <= 80)
11. grade = 8;
12. else if (i > 80 && i <= 90)
13. grade = 9;
14. else if (i > 90 && i <= 100)
15. grade = 10;
16. char sign = ' ';
17. if (grade) {
18. int p = i % 10;
19. if (grade != 5) {
20. if (p >= 1 && p <= 3)
21. sign = '-';
22. else if (grade != 10 && (p >= 8 || p == 0))
23. sign = '+';
}
24. printf (" The grade is %d%c. \n", grade, sign);
}
25. return 0;
}
这是按照上面作弊 sheet 图表中的指示创建的输出。请注意,节点 16 和 24 之前作为许多条件节点的连接节点。
致谢:我已使用 draw.io 创建上面发布的图像。
注意:绘制CFG的秘诀是将每个语句独立于程序,绘制它然后link它是其余部分的入口和出口图。
以下是我遵循的几个初始步骤
- 语句 1、2 和 3 是非条件语句,因此我创建了三个块 link 将它们放在一起。
- 语句 4 是条件语句。所以我必须为它创建 4 个块。第一个用于语句 4,第二个和第三个用于 TRUE、FALSE 边,最后一个用于 JOIN 节点。如果为真则语句 5 是 运行 如果不是则我们转到语句 6。从语句 5 我们直接转到语句 16,这是我们的连接节点。最后我们 link 阻止 4 以阻止 3 的出边。
- 现在语句 6 本身是一个条件语句,所以我们再次需要 4 个块。我们已经有了自己的第 6 块。加入节点,因为它将是语句 16,就好像它的条件为真,然后语句 7 是 运行,它直接转到 16。现在我们已经有了块 6 和 16,所以我们只是需要语句 7 和 8 的 TRUE、FALSE 分支块。
等等,我们不断检查适用节点的作弊 sheet 并隔离创建它们,然后 link 然后与之前的节点一起创建。
我的 C 前端工具 Crokus(在两者上都可用 github and rubygems)直接通过解析你的 C 代码来提供。