静态分析与JavaScript的定制规则?(Static-analysis with custom

2019-07-30 19:19发布

是否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"}
    }
}

Answer 1:

你应该能够建立这样的使用亚组的卷饼 ,它使用从解析器丑化-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 。值实际上在从卷饼分析树节点,所以每个值已它相关的状态等) 。

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 ,这似乎是双方更加积极地开发更好的记录。 它也比据说快丑化。 你可以尝试一下在如解析解析演示页 。 您是前人的精力能够建立使用这种一个很好的解决方案,记错。



Answer 2:

我试着用,可以从代码中访问(在我的情况Python)的JavaScript解释的东西。 所以像口译pynocerospynarcissuspyv8可能会帮助我。

有一个答案在这里如何安装py8: https://stackoverflow.com/a/11879224/1577343

由于上述办法我也没有太多的成功,我更喜欢使用的ECMAScript的解析器的静态分析解决方案。

静态分析,据我可以得到使用JSLint的解析器( 运行JSLint的上.js文件从调试的Chrome或Firefox控制台 ):但我不知道如何进一步使用。

{
    "string": "(begin)",
    "first": [
        {
            "string": "var",
            "arity": "statement",
            "first": [
                {
                    "string": "jobs"
                },
                {
                    "string": "found"
                },
                {
                    "string": "list"
                }
            ]
        },
        {
            "string": "=",
            "arity": "infix",
            "first": {
                "string": "jobs"
            },
            "second": {
                "string": "(",
                "arity": "infix",
                "first": {
                    "string": ".",
                    "arity": "infix",
                    "first": {
                        "string": "mylibrary"
                    },
                    "second": {
                        "string": "getJobs"
                    }
                },
                "second": []
            }
        },
        {
            "string": "=",
            "arity": "infix",
            "first": {
                "string": "found"
            },
            "second": {
                "string": "(",
                "arity": "infix",
                "first": {
                    "string": ".",
                    "arity": "infix",
                    "first": {
                        "string": "jobs"
                    },
                    "second": {
                        "string": "find"
                    }
                },
                "second": [
                    {
                        "string": "Python",
                        "arity": "string"
                    }
                ]
            }
        },
        {
            "string": "=",
            "arity": "infix",
            "first": {
                "string": "list"
            },
            "second": {
                "string": "(",
                "arity": "infix",
                "first": {
                    "string": ".",
                    "arity": "infix",
                    "first": {
                        "string": "found"
                    },
                    "second": {
                        "string": "convert"
                    }
                },
                "second": [
                    {
                        "string": "html",
                        "arity": "string"
                    }
                ]
            }
        }
    ]
}


Answer 3:

PMD支持ECMAScript中使用自定义规则的静态分析:

使用当前的规则集作为例子之一。 复制并粘贴到新的文件,从中删除所有旧的规则,并更改名称和描述。

请注意,您可以自定义个人引用规则。 一切,但该类规则的可自定义的规则集覆盖。

您也可以通过使用排除模式的规则集进行处理,使用可选的首要排除某些文件包括模式。 甲文件将从处理时,有一个匹配的排除模式,但没有匹配的图案包括被排除。

在源文件路径的路径分隔符被归一化成为“/”字符,所以相同的规则集可以在多个平台上透明地使用。

另外,该排除/包括技术的原理,无论PMD是如何使用的(如命令行,IDE,蚂蚁),使其更容易让你的PMD应用程序规则在整个环境保持一致。

您可以指定到您的自定义规则集名称的完整路径的旁边内置的PMD规则集

要看到它在你的IDE,它添加到规则集/ rulesets.properties

参考

  • PMD / PMD-的JavaScript / SRC /主/资源/规则集/ ECMAScript的在主·PMD / PMD

  • 分析的Javascript PMD的Maven

  • PMD - PMD特性

  • PMD -如何使规则集

  • 结合两种PMD检查

  • 在PMD规则使用正则表达式

  • PMD - IDE集成



文章来源: Static-analysis with custom rules for JavaScript?