c - Frama-C:找到循环结束的位置
问题描述
在以下示例代码中:
void kernel(int ni, int nj, int nk, float alpha, float *tmp, float *A, float *B) {
int i, j, k;
for (i = 0; i < ni; i++) {
for (j = 0; j < nj; j++) {
tmp[i * nj + j] = 0.0f;
for (k = 0; k < nk; ++k) {
tmp[i * nj + j] += alpha * A[i * nk + k] * B[k * nj + j];
}
}
}
}
我试图获得}
(标志着每个循环的结束)的位置,但没有成功。
- 例如,对于第一个循环,我查看了
stmt.preds
list 并找到了i = 0;
andi++
。该stmt.succs
列表仅包含对 的if
测试i < ni
。 }
do 不对应于任何类型的 stmt 或 Instr 并且不存在于stmt.bstmts
列表中。Stmts_graph
在like中使用函数get_all_stmt_last_stmts
(这给了我一个break
语句,并且这个break
语句与循环具有相同的位置)不能解决问题。
如何获取循环结束的位置(此处}
)。谢谢。
解决方案
在 Frama-C 中,没有与}
代码中的结束相对应的语句之类的东西。仅存在可能具有可观察效果的语句(对内存或控制流);唯一的例外是Skip
,但 Frama-C 避免生成这些。
如果您正在寻找从 AST 中提取的 的行号
}
,您可以查看附加到每个语句的位置的第二个组成部分。从 中可以看出Cil_types
,位置是成对的Lexing.position
,第二个表示指令的结束。然而,Frama-C 很少努力获得该组件的准确信息,因为它从未显示如果您正在寻找退出循环的 AST 语句,请寻找那些在循环内部,并且其后继(
.succs
字段)在外部的语句。这个特定的边缘将或多或少与您的}
. 在示例的循环中,您应该找到break
为处理退出条件而创建的语句。
推荐阅读
- node.js - 地理定位问题,一旦给出结果,其他所有超时
- python - Facebook fasttext bin 模型 UnicodeDecodeError
- jenkins-pipeline - 如何从詹金斯脚本管道创建属性文件
- c# - 在静态 IP 上连续 Ping,如果返回 false,则发送电子邮件
- python - 按下按钮时从所有滑块中获取值
- bash - Bash/Shell 将命令日期/时间输出与当前日期/时间进行比较
- angular - Angular Material Table Alphanumeric Sorting Behaviour
- javascript - Have to click on an list item 2 times to fire jQuery
- oracle-apex-5 - 在交互式报表的透视视图中隐藏列标题 (Oracle APEX 5.1)
- python - Combine multiple replace commands