gpt4 book ai didi

javascript - 使用 JavaScript 的自定义规则进行静态分析?

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:37:06 28 4
gpt4 key购买 nike

JSLint、JSHint 或其他一些开源静态代码分析工具是否支持为代码合规性添加自定义规则,或者是否有一些符合 ECMAScript 的解析器,我可以使用这些解析器来获得尽可能接近在中看到的结果的结果下面的片段?

例如,我想查看 JavaScript 代码并列出调用了哪些函数,如果它调用一个库(或智能手机为 HTML5 小部件提供的 API)来注册该 API 命名空间下的所有内容,制作对象及其属性的树,以查看是否从可以追溯到的对象中调用函数,可能使用 XML、JSON 或其他结构化格式的输出。

例如,我有这段 JavaScript 代码(它什么都不做,只是为了论证):

jobs = mylibrary.getJobs();
found = jobs.find("Python");
list = found.convert("html");

我想让我的分析器工具得到这个:

{
"mylibrary": {
"jobs": {"maker":"getJobs", "parent": "mylibrary"},
"found": {"maker": "find", "parent": "jobs", "parameters": "Python"},
"list": {"maker": "convert", "parent": "found"}
}
}

最佳答案

您应该能够使用子堆栈的 burrito 构建类似这样的东西,它使用来自 Uglify-JS 的解析器并给予,我想,你所需要的一切。快速示例:

src.js:

var jobs, found, list;
jobs = mylibrary.getJobs();
found = jobs.find("Python");
list = found.convert("html");

ast.js:

var fs = require('fs'),
burrito = require('burrito');

var src = fs.readFileSync('./src.js', 'utf8');

burrito(src, function (node) {
console.log(node.name, node.value);
});

您将如何构建您所请求的结构,我不太确定(我自己不太精通 AST 解析),但我相信这需要您付出一些努力。也许您不需要介于两者之间的结构,可以这么说,但可以只验证卷饼中的每个节点,其中每个 call 节点都将根据其值(函数名称、对象名称等)进行验证,如果未通过验证,则会发出警告。

这是上面 burrito 调用的输出(注意:每个 [Object] 等都被 node.js 的 console.log< chop 了。值实际上是来自 burrito 的解析树中的节点,因此每个值都有其关联的状态等)。

var [ [ [ 'jobs' ], [ 'found' ], [ 'list' ] ] ]
stat [ [ { name: 'assign', start: [Object], end: [Object] },
true,
[ [Object], 'jobs' ],
[ [Object], [Object], [] ] ] ]
assign [ true,
[ { name: 'name', start: [Object], end: [Object] }, 'jobs' ],
[ { name: 'call', start: [Object], end: [Object] },
[ 'dot', [Object], 'getJobs' ],
[] ] ]
name [ 'jobs' ]
call [ [ 'dot', [ 'name', 'mylibrary' ], 'getJobs' ], [] ]
stat [ [ { name: 'assign', start: [Object], end: [Object] },
true,
[ [Object], 'found' ],
[ [Object], [Object], [Object] ] ] ]
assign [ true,
[ { name: 'name', start: [Object], end: [Object] }, 'found' ],
[ { name: 'call', start: [Object], end: [Object] },
[ 'dot', [Object], 'find' ],
[ [Object] ] ] ]
name [ 'found' ]
call [ [ 'dot', [ 'name', 'jobs' ], 'find' ],
[ [ [Object], 'Python' ] ] ]
string [ 'Python' ]
stat [ [ { name: 'assign', start: [Object], end: [Object] },
true,
[ [Object], 'list' ],
[ [Object], [Object], [Object] ] ] ]
assign [ true,
[ { name: 'name', start: [Object], end: [Object] }, 'list' ],
[ { name: 'call', start: [Object], end: [Object] },
[ 'dot', [Object], 'convert' ],
[ [Object] ] ] ]
name [ 'list' ]
call [ [ 'dot', [ 'name', 'found' ], 'convert' ],
[ [ [Object], 'html' ] ] ]
string [ 'html' ]

更新:

另一个选项是更新的(?)ES 解析器 Esprima ,它似乎得到了更积极的开发和更好的记录。据报道,它也比 Uglify 更快。您可以尝试例如在 Parsing Demo page 上解析.在我看来,您应该能够使用它构建一个好的解决方案。

关于javascript - 使用 JavaScript 的自定义规则进行静态分析?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11816713/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com