自动添加一个私有构造函数与Sensei

发表于2020年12月14日
作者:Alan Richardson
案例研究

自动添加一个私有构造函数与Sensei

发表于2020年12月14日
作者:Alan Richardson
查看资源
查看资源

自动添加一个私有构造函数与Sensei


在一个实用类中,当字段和方法都是静态的时候,没有明显的理由让我把它实例化。

例如,UtilityClass utility = new UtilityClass()。

下面的代码是一个实用程序类的简单实现。

public class UtilityClass {
    public static final Boolean ULTIMATE_TRUTH = true;
    public static boolean getTrue(){
        return ULTIMATE_TRUTH;
    }
}


这是静态分析工具可以发现的编码模式类型,但它们往往不提供修复问题的能力。

我可以使用Sensei 来识别编码模式,并自动生成一个私有构造函数,使我无法实例化该类。

搜索类

我将在公用事业类上添加一个新的配方,名为。

  •  静态类:创建私有构造函数。


静态类的一般设置


而最初,我将创建一个简单的匹配器来搜索一个类。

搜索。

  class: {}


这将匹配任何类,这足以让我开始写一个快速修复。一旦我有了一个有效的快速修复方法,我将改进搜索,使其在更有可能出现需要私有构造函数的类时突出显示。

快速修复

对于快速修复,我将希望生成一个私有构造函数。

在示例类中,这将看起来像。

   Private UtilityClass(){}。

为了将上述代码添加到我的类中,我的快速修复将添加一个方法,而该方法的名称将是一个使用类名的Mustache模板。

可用的修复方法。

- name: "add private constructor"
  actions:
  - addMethod:
      method: "private {{{ name }}}(){}"


在GUI编辑器中,我使用显示变量来创建小胡子模板,然后编辑字段,添加私有修饰符、大括号和小括号,使其在语法上正确。

添加私有构造函数

现在,这将允许我在任何类中添加一个私有构造函数。

QuickFix的预览功能对我有帮助,因为我可以在编写Mustache模板时看到生成的代码。

实用类添加私人构造函数

现在我知道我可以解决这个问题了。我将细化搜索条件,在最合适的时候显示食谱。

搜索缺失的结构体

理想情况下,我不希望创建一个对每个类都标记错误的配方。因此,我将在搜索中添加一些额外的条件,以便我们只匹配那些没有构造函数的类。

搜索。

  class:
without:
child:
method:
constructor: true


YAML与GUI略有不同。

在GUI中,我将其配置为寻找一个没有子方法的类,该方法是一个构造函数'yes'。我们在GUI中使用'yes'而不是'true',以使GUI更加人性化。


在代码中搜索类


这个配方现在只对任何没有构造函数的类显示出来。

缩小搜索范围,寻找可能的肇事者

所以我可能想进一步寻找静态方法或字段的存在。

我寻找任何没有构造函数的类,它有所有公共静态字段或所有公共静态方法。

搜索。

  class:
with:
anyOf:
- child:
method:
allOf:
- modifier:"public"
- 修改器。"static"
- child:
field:
allOf:
- modifier:"static"
- 修饰语:"static" "public"
without:
child:
method:
constructor: true


由于Sensei 是用来帮助我这个程序员在IDE中,而不是静态地分析代码和报告所有的错误,这个过滤器足以排除我的代码库中的大多数类,在这些类中我可能有充分的理由拥有一个默认的公共构造函数。

在一些项目中,这可能会走得太远,因为实用类可能有私有方法,所以我可能会选择寻找 "任何 "公共静态方法的存在,而不是 "所有"。

       - 子项:
领域:
anyOf:
- 修饰语。"static"
- 修改器。"公共"


提示

Sensei 不是用来取代静态分析工具的。Sensei 可以增强静态分析工具,以解决与你的编码过程或技术有关的常见问题。通过复制足够的匹配来突出一个问题,并通过生成快速修复代码来支持开发过程。

我想做的是创造一个足够简单的配方,包括我需要的所有情况,但要对它进行过滤,以便它不会在每个班级都被推荐。

在研究配方时,我试图降低它们的风险,在这种情况下,我不确定是否可以创建私有构造函数,所以我先创建了QuickFix。然后重构了搜索条件,使其更加具体。

有时在研究食谱时,我不确定如何进行搜索,所以我先在这方面下功夫。

我发现当我逐步建立配方时,在重构QuickFix和搜索之间切换,更容易创建配方。

---


你可以使用 "Preferences\ Plugins"(Mac)或 "Settings\ Plugins"(Windows)从IntelliJ内部安装Sensei ,然后只需搜索 "sensei secure code"


这方面的源代码和配方可以在Secure Code Warrior GitHub账户的`sensei-blog-examples`仓库中找到,在`pojoexamples`模块中。

https://github.com/securecodewarrior/sensei-blog-examples

查看资源
查看资源

作者

艾伦-理查德森

想要更多吗?

在博客上深入了解我们最新的安全编码见解。

我们广泛的资源库旨在增强人类对安全编码技术提升的方法。

查看博客
想要更多吗?

获取关于开发者驱动的安全的最新研究

我们广泛的资源库充满了有用的资源,从白皮书到网络研讨会,让你开始使用开发者驱动的安全编码。现在就去探索它。

资源中心

自动添加一个私有构造函数与Sensei

发表于2020年12月14日
作者:Alan Richardson

自动添加一个私有构造函数与Sensei


在一个实用类中,当字段和方法都是静态的时候,没有明显的理由让我把它实例化。

例如,UtilityClass utility = new UtilityClass()。

下面的代码是一个实用程序类的简单实现。

public class UtilityClass {
    public static final Boolean ULTIMATE_TRUTH = true;
    public static boolean getTrue(){
        return ULTIMATE_TRUTH;
    }
}


这是静态分析工具可以发现的编码模式类型,但它们往往不提供修复问题的能力。

我可以使用Sensei 来识别编码模式,并自动生成一个私有构造函数,使我无法实例化该类。

搜索类

我将在公用事业类上添加一个新的配方,名为。

  •  静态类:创建私有构造函数。


静态类的一般设置


而最初,我将创建一个简单的匹配器来搜索一个类。

搜索。

  class: {}


这将匹配任何类,这足以让我开始写一个快速修复。一旦我有了一个有效的快速修复方法,我将改进搜索,使其在更有可能出现需要私有构造函数的类时突出显示。

快速修复

对于快速修复,我将希望生成一个私有构造函数。

在示例类中,这将看起来像。

   Private UtilityClass(){}。

为了将上述代码添加到我的类中,我的快速修复将添加一个方法,而该方法的名称将是一个使用类名的Mustache模板。

可用的修复方法。

- name: "add private constructor"
  actions:
  - addMethod:
      method: "private {{{ name }}}(){}"


在GUI编辑器中,我使用显示变量来创建小胡子模板,然后编辑字段,添加私有修饰符、大括号和小括号,使其在语法上正确。

添加私有构造函数

现在,这将允许我在任何类中添加一个私有构造函数。

QuickFix的预览功能对我有帮助,因为我可以在编写Mustache模板时看到生成的代码。

实用类添加私人构造函数

现在我知道我可以解决这个问题了。我将细化搜索条件,在最合适的时候显示食谱。

搜索缺失的结构体

理想情况下,我不希望创建一个对每个类都标记错误的配方。因此,我将在搜索中添加一些额外的条件,以便我们只匹配那些没有构造函数的类。

搜索。

  class:
without:
child:
method:
constructor: true


YAML与GUI略有不同。

在GUI中,我将其配置为寻找一个没有子方法的类,该方法是一个构造函数'yes'。我们在GUI中使用'yes'而不是'true',以使GUI更加人性化。


在代码中搜索类


这个配方现在只对任何没有构造函数的类显示出来。

缩小搜索范围,寻找可能的肇事者

所以我可能想进一步寻找静态方法或字段的存在。

我寻找任何没有构造函数的类,它有所有公共静态字段或所有公共静态方法。

搜索。

  class:
with:
anyOf:
- child:
method:
allOf:
- modifier:"public"
- 修改器。"static"
- child:
field:
allOf:
- modifier:"static"
- 修饰语:"static" "public"
without:
child:
method:
constructor: true


由于Sensei 是用来帮助我这个程序员在IDE中,而不是静态地分析代码和报告所有的错误,这个过滤器足以排除我的代码库中的大多数类,在这些类中我可能有充分的理由拥有一个默认的公共构造函数。

在一些项目中,这可能会走得太远,因为实用类可能有私有方法,所以我可能会选择寻找 "任何 "公共静态方法的存在,而不是 "所有"。

       - 子项:
领域:
anyOf:
- 修饰语。"static"
- 修改器。"公共"


提示

Sensei 不是用来取代静态分析工具的。Sensei 可以增强静态分析工具,以解决与你的编码过程或技术有关的常见问题。通过复制足够的匹配来突出一个问题,并通过生成快速修复代码来支持开发过程。

我想做的是创造一个足够简单的配方,包括我需要的所有情况,但要对它进行过滤,以便它不会在每个班级都被推荐。

在研究配方时,我试图降低它们的风险,在这种情况下,我不确定是否可以创建私有构造函数,所以我先创建了QuickFix。然后重构了搜索条件,使其更加具体。

有时在研究食谱时,我不确定如何进行搜索,所以我先在这方面下功夫。

我发现当我逐步建立配方时,在重构QuickFix和搜索之间切换,更容易创建配方。

---


你可以使用 "Preferences\ Plugins"(Mac)或 "Settings\ Plugins"(Windows)从IntelliJ内部安装Sensei ,然后只需搜索 "sensei secure code"


这方面的源代码和配方可以在Secure Code Warrior GitHub账户的`sensei-blog-examples`仓库中找到,在`pojoexamples`模块中。

https://github.com/securecodewarrior/sensei-blog-examples

我们希望得到您的许可,向您发送有关我们产品和/或相关安全编码主题的信息。我们将始终以最谨慎的态度对待您的个人资料,绝不会将其出售给其他公司用于营销目的。

要提交表格,请启用 "分析 "cookies。完成后,请随时再次禁用它们。