($width) AND $width .= 'px';
$style = " style=\"width: $width\"";
}
$value = $value ? $value : date('H:i');
$s = "";
return $s;
}
// form_date('start', '2018-07-05') 为空则当前日期
function form_date($name, $value = 0, $width = FALSE)
{
$style = '';
if (FALSE !== $width) {
is_numeric($width) AND $width .= 'px';
$style = " style=\"width: $width\"";
}
$value = $value ? $value : date('Y-m-d');
$s = "";
return $s;
}
/**用法
*
* echo form_radio_yes_no('radio1', 0);
* echo form_checkbox('aaa', array('无', '有'), 0);
*
* echo form_radio_yes_no('aaa', 0);
* echo form_radio('aaa', array('无', '有'), 0);
* echo form_radio('aaa', array('a'=>'aaa', 'b'=>'bbb', 'c'=>'ccc', ), 'b');
*
* echo form_select('aaa', array('a'=>'aaa', 'b'=>'bbb', 'c'=>'ccc', ), 'a');
*/
?>组保留的标签 余下为需要删除的标签
unset($oldtag[$key]);
}
}
}
if (!empty($oldtag)) {
$tagids = array();
foreach ($oldtag as $tagid => $tagname) {
$tagids[] = $tagid;
}
well_oldtag_delete($tagids, $tid);
}
$r = well_tag_process($tid, $fid, $create_tag, $tagarr);
return $r;
}
// 删除标签和绑定的主题
function well_oldtag_delete($tagids, $tid)
{
$pagesize = count($tagids);
$arrlist = well_tag_find_by_tagids($tagids, 1, $pagesize);
$delete_tagids = array(); // 删除
$tagids = array();
$n = 0;
foreach ($arrlist as $val) {
++$n;
if (1 == $val['count']) {
// 只有一个主题
$delete_tagids[] = $val['tagid'];
} else {
$tagids[] = $val['tagid'];
}
}
!empty($delete_tagids) and well_tag_delete($delete_tagids);
$arlist = well_tag_thread_find_by_tid($tid, 1, $n);
if ($arlist) {
$ids = array();
foreach ($arlist as $val) $ids[] = $val['id'];
well_tag_thread_delete($ids);
}
!empty($tagids) and well_tag_update($tagids, array('count-' => 1));
}
// 标签数据处理 $arr=新提交的数组 $tagarr=保留的旧标签
function well_tag_process($tid, $fid, $new_tags = array(), $tagarr = array())
{
if (empty($tid)) return '';
// 新标签处理入库
if ($new_tags) {
$threadarr = array();
$tagids = array();
$i = 0;
$size = 5;
$n = count($tagarr);
$n = $n > $size ? $size : $size - $n;
foreach ($new_tags as $name) {
++$i;
$name = trim($name);
$name = stripslashes($name);
$name = strip_tags($name);
$name = str_replace(array(' ', '#', "@", "$", "%", "^", '&', '·', '<', '>', ';', '`', '~', '!', '¥', '……', ';', '?', '?', '-', '—', '_', '=', '+', '.', '{', '}', '|', ':', ':', '、', '/', '。', '[', ']', '【', '】', '‘', ' ', ' ', ' ', ' ', ' '), '', $name);
$name = htmlspecialchars($name, ENT_QUOTES);
if ($name && $i <= $n) {
// 查询标签
$read = well_tag_read_name($name);
if ($read) {
// 存在 count+1
$tagids[] = $read['tagid'];
} else {
// 入库
$arr = array('name' => $name, 'count' => 1);
$tagid = well_tag_create($arr);
FALSE === $tagid and message(-1, lang('create_failed'));
$read = array('tagid' => $tagid, 'name' => $name);
}
$tag_thread = array('tagid' => $read['tagid'], 'tid' => $tid);
$threadarr[] = $tag_thread;
$tagarr[$read['tagid']] = $read['name'];
}
}
!empty($threadarr) and tag_thread_big_insert($threadarr);
!empty($tagids) and well_tag_update($tagids, array('count+' => 1));
}
$json = empty($tagarr) ? '' : xn_json_encode($tagarr);
return $json;
}
?>return $r;
}
/**
* @param int $page 页数
* @param int $pagesize 每页显示数量
* @return mixed
*/
function link_find($page = 1, $pagesize = 100)
{
$arr = link__find($cond = array(), array('rank' => -1), $page, $pagesize);
return $arr;
}
/**
* @param $id
* @return bool 返回FALSE失败 TRUE成功
*/
function link_delete($id)
{
if (empty($id)) return FALSE;
$r = link__delete(array('id' => $id));
link_delete_cache();
return $r;
}
//--------------------------kv + cache--------------------------
/**
* @return mixed 返回全部友情链接
*/
function link_get($page = 1, $pagesize = 100)
{
$g_link = website_get('friends_link');
if (empty($g_link)) {
$g_link = link_find($page, $pagesize);
$g_link AND website_set('friends_link', $g_link);
}
return $g_link;
}
// delete kv and cache
function link_delete_cache()
{
website_set('friends_link', '');
return TRUE;
}
?> $v = implode(",", $v);
$temp[] = $v;
}
// 去掉重复的字符串,也就是重复的一维数组
$temp = array_unique($temp);
// 再将拆开的数组重新组装
$output = array();
foreach ($temp as $k => $v) {
if ($stkeep) $k = $starr[$k];
if ($ndformat) {
$temparr = explode(",", $v);
foreach ($temparr as $ndkey => $ndval) $output[$k][$ndarr[$ndkey]] = $ndval;
} else $output[$k] = explode(",", $v);
}
return $output;
}
// 合并二维数组 如重复 值以第一个数组值为准
function array2_merge($array1, $array2, $key = '')
{
if (empty($array1) || empty($array2)) return NULL;
$arr = array();
foreach ($array1 as $k => $v) {
isset($v[$key]) ? $arr[$v[$key]] = array_merge($v, $array2[$k]) : $arr[] = array_merge($v, $array2[$k]);
}
return $arr;
}
/*
* 对二维数组排序 两个数组必须有一个相同的键值
* $array1 需要排序数组
* $array2 按照该数组key排序
* */
function array2_sort_key($array1, $array2, $key = '')
{
if (empty($array1) || empty($array2)) return NULL;
$arr = array();
foreach ($array2 as $k => $v) {
if (isset($v[$key]) && $v[$key] == $array1[$v[$key]][$key]) {
$arr[$v[$key]] = $array1[$v[$key]];
} else {
$arr[] = $v;
}
}
return $arr;
}
?>
源码, AST, IR, CFG之间的关系梳理-软件玩家 - 软件改变生活!
源码, AST, IR, CFG之间的关系梳理
在上一篇文章“代码检查过程中为什么需要涉及到编译呢?”中,有提到SAST代码检查工具里编译过程会经历哪些阶段,里面有提到:
一般来说,完整的编译过程会经历:对源代码进行词法、语法、语义的分析,生成AST,接着转换为IR,生成CFG,对数据流进行分析、优化,生成目标代码。
总结一下就说是源码 > AST > IR > CFG 这么个逻辑顺序,那它们三之间是怎么个依赖关系呢?本文尝试来梳理下。
源码和AST的关系
- 源码就是程序员用JAVA, C, C++, Python等语言编写出来的代码。
- AST, Abstract Syntax Tree 抽象语法树,是用来表示程序代码结构的树形数据结构。
在讲AST之前,我们先解释下解析树(parse tree),它又被叫做具象语法树(CST,Concret Syntax Tree),会包含代码中所有的语法信息,可以说是代码的直接翻译。而AST既然被叫做抽象语法树,从名字上就可以看出来,它会剥离掉一些不重要的细节(忽略掉一些语法信息)。因此,AST可以说是解析树(parse tree)的一个精简版本。
源码和AST之间的转换是:
- 源码通过编译器或解析器进行词法分析、语法分析、语义分析等操作,生成AST。
- AST也可以通过代码生成器或反解析器进行优化、转换、翻译等操作,转换生成源码。
词法分析
词法分析, lexical analysis, 属于编译的第一个阶段,这其中会涉及到两个主要的工具:scanner和分词器。Scanner会从头到尾去扫描源代码文件,把文本拆成单词;之后这些单词会传入分词器,经过一些列识别器(关键字识别器、标识符识别器、常量识别器、操作符识别器等),识别确认单词的词性,生成一个<type, value>形式的二元组token序列(组合里的type指单词种类,value则是属性值)。
语法分析
词法分析完成之后,第二个阶段就是语法分析, syntax analysis。在这个阶段,token序列会传递给解析器,根据给定的语法规则,由其识别出代码中的各类短语并根据语言的文法规则来生成解析树。其主要目标是为了验证源代码是否符合语言的语法规范,同时创建源代码的解析树或抽象语法树(AST),用来表示源代码的层次和逻辑关系。
语义分析
词法分析和语法分析两个阶段中相关的操作都是上下文无关的。而语义分析的本质,就是针对上下文相关情况去做处理。
语义分析,Semantic Analysis,对抽象语法树进行下一步的检查和处理。其主要目的是为了确定源码是否有意义,同时也可以对源代码进行一些优化和转换。
常用的AST在线工具
在线转换代码为AST的工具地址:/
AST和IR的关系
当从源码生成了AST之后,IR也可以从AST转换/变形而来。
两者都可以被SAST工具用于检查,区别在于:AST更接近与源代码的语法结构,依赖于编程语言种类,扫描分析效率更快,但缺少控制流信息,即AST更关注代码的表面特征和规范性,更适合做一些简单的模式匹配和规则检查;IR则更接近于机器码的语义结构,不依赖于编程语言种类,包含了控制流信息,更关注于代码的深层含义和安全性,更适合做一些复杂的数据流分析和漏洞检测。
IR和CFG的关系
CFG是从IR生成来的,是一种用来表示程序代码执行流程的图形数据结构;可以这么说,CFG是IR的一种变形,它把代码分给为基本块,并用边表示基本块之间的跳转关系。
IR和CFG之间的区别是:IR接近于机器码的语义结构,不依赖于编程语言种类,包含了控制流信息,更关注于代码的深层含义和安全性;CFG则带有控制流(专注于从Source到Sink的过程),可以更直观地展示代码的执行路径和分支条件,便于进行控制流分析和路径敏感的分析。
参考链接
- /
- (linguistics)
本文标签:
源码ASTIRCFG之间的关系梳理
更多相关文章
基于SpringBoot+Vue的设备资源综合管理平台设计和实现(源码+论文+部署讲解等)
博主介绍:✌全网粉丝50W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金华为云阿里云InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师讲师
1.0 java_Mybatis_oracle基于WEB的仓库管理系统的设计与实现(源码+数据库sql+论文+视频齐全)----库管理系统---源码私信博主
基于Web的仓库管理系统的设计与实现 摘 要 仓库物品的管理是与我们的日常生活息息相关的一个重大问题。随着我国经济飞速的发展,改革开放的不断深入,企业要想在激烈的市场竞争中立于不败之地&#
基于SpringBoot+Vue医疗器械管理系统设计和实现(源码+LW+部署讲解)
博主介绍:✌全网粉丝50W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金华为云阿里云InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师讲师
基于Java实验室仪器设备管理系统设计实现(源码+lw+部署文档+讲解等)
博主介绍:✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金华为云阿里云InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 
简单的商品信息管理系统(Java 和sql server数据库)源码
源码打包链接: 2022.3.19更新 修改了标题为商品信息管理系统,链接: https:pan.baidus1gVV36dhbv8IKLaKO_VSi5w?pwd=i42j 提取码: i42j 根据老师要求上交的数据库作业,做
【数据库课程设计】SQLServer数据库课程设计(学生宿舍管理),课设报告+源码+数据库关系图
数据库课程设计——学生宿舍管理,需要全部源码可以关注私信我,把邮箱发在评论区 前言一、课题背景和开发环境1、课题背景2、开发环境 二、系统功能及示意图1、系统实现功能2、功能示意图2.1学生模块2
基于Java开发的学校信息管理系统的设计与实现(含论文及毕业设计源码、数据库文件)
摘要 现在越来越多的大学生涌进大学,大学生数量越来越多,传统的在教室里老师声嘶力竭式的选课模式缺点越来越明显,效率低,管理难。现在正好赶上了万物互联的互
SpringBoot微信小程序网上手机商城系统设计与实现计算机毕业设计源码作品和开题报告
博主介绍:黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者,CSDN博客专家,在线教育专家,CSDN钻石讲师ÿ
【OFDM仿真】空时分组码的空间调制系统仿真(含BER)【含Matlab源码 12053期】
💥💥💥💥💥💥💥💥💞&am
【答题卡识别】Hough变换答题卡识别(含学号答案 得分 错题)系统【含GUI Matlab源码 4050期】
💥💥💥💥💥💥💥💥💞&am
计算机毕业设计SpringBoot+Vue.js人格障碍诊断系统(源码+文档+PPT+讲解)
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示
(附源码)火车票订票系统 毕业设计 171538
火车票订票系统的设计与实现 摘 要 信息化社会内需要与之针对性的信息获取途径,但是途径的扩展基本上为人们所努力的方向,由于站在的角度存在偏差,人们经常能够获得不同类型信息&a
【任务协同】基于matlab合同网算法无人机任务重规划【含Matlab源码 13064期】
💥💥💥💥💥💥💞💞💞&am
计算机毕业设计SpringBoot+Vue.js项目申报系统(源码+文档+PPT+讲解)
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示
零基础Python实现五子棋小游戏(附完整源码)
立即下载完整资料👉 点击立即免费获取 一、五子棋实现原理 五子棋核心逻辑主要包含三个部分: 棋盘初始化(15x15网格)落子逻辑判断&#
2024全开源免费AI网址导航网站源码 AigoTools
2024全开源免费AI网址导航网站源码 AigoTools Aigotools 可以帮助用户快速创建和管理导航站点,内置站点管理和自动收录功能,同时提供国际化、SEO、多种图片存储方案。让用户可以
计算机毕业设计SpringBoot+Vue.js视频点播系统(源码+文档+PPT+讲解)
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示
【关注可白嫖源码】-SSM公司会议管理系统
摘 要 随着社会与经济的发展,会议在人们的日常生活中越来越占据重要的地位。在企业中, 会议更是管理中常用的一-种沟通方式和工作手段,已成为企业运作与管理的重要部分,良好的会议管理对企业具有重大的意义。本系统适用公司的会议室管理&#x
【关注可白嫖源码】-企业人事管理系统的设计与实现
摘 要 由于数据库和数据仓库技术的快速发展,企业人事管理系统建设越来越向模块化、智能化、自我服务和管理科学化的方向发展。人事管理系统对处理对象和服务对象,自身的系统结构,处理
免费送源码:Java+Springboot+MySQL Springboot在线问诊系统 计算机毕业设计原创定制
摘 要 针对医院门诊等问题,对在线问诊进行研究分析,然后开发设计出在线问诊系统以解决问题。在线问诊系统主要功能模块包括首页、轮播图管理、公告信息管理、资源管理、系统用户管理(
发表评论