界: Code Quality

コードの質が低いと、予測できない動作につながります。ユーザーの視点には、それがしばしば使い勝手の悪さとなって現れます。攻撃者にとっては、予期せぬ方法でシステムにストレスを与える機会となります。

Poor Style: Confusing Naming

Abstract
このクラスは同じ名前のフィールドとメソッドを含みます。
Explanation
同じ名前のメンバーフィールドとメソッドが存在していると混乱します。フィールドにアクセスする、またはその逆の場合に、プログラマが誤ってメソッドをコールしやすくなります。

例 1:

public class Totaller {
private int total;
public int total() {
...
}
}
References
[1] Standards Mapping - CIS Azure Kubernetes Service Benchmark 1
[2] Standards Mapping - CIS Amazon Elastic Kubernetes Service Benchmark 5
[3] Standards Mapping - CIS Amazon Web Services Foundations Benchmark 1
[4] Standards Mapping - CIS Google Kubernetes Engine Benchmark normal
[5] Standards Mapping - Common Weakness Enumeration CWE ID 398, CWE ID 710
[6] Standards Mapping - Smart Contract Weakness Classification SWC-119
desc.structural.java.poor_style_confusing_naming.member_and_method
Abstract
コントラクトが、曖昧で誤用されやすい、シャドウされた変数を使用しています。
Explanation
Solidity では、開発者は状態変数を曖昧に宣言できます。つまり、2 つの異なるコンテキストで 2 つの異なる変数を同じ名前で宣言することは可能ですが、それらを使用すると混乱や誤用につながる可能性があることを意味します。

これは、関数レベルと継承レベルの両方で発生する可能性があります。たとえば、Contract1 が var1 を宣言し、同じく var1 という名前の変数を宣言する Contract2 を継承すると、変数は曖昧となり、後でスマート コントラクトを実行する際に混同しやすくなります。

例 1: 次のコードは、継承を使用して、両方のスマート コントラクトで同じ名前の状態変数を宣言します。どれが実際のトークン セールの hardcap かを見極めるのは困難になる可能性があります。


contract Tokensale {
uint hardcap = 10000 ether;

function Tokensale() { }

function fetchCap() public constant returns(uint) {
return hardcap;
}
}

contract Presale is Tokensale {
uint hardcap = 1000 ether;

function Presale() Tokensale() { }
}
References
[1] Standards Mapping - CIS Azure Kubernetes Service Benchmark 1
[2] Standards Mapping - CIS Amazon Elastic Kubernetes Service Benchmark 5
[3] Standards Mapping - CIS Amazon Web Services Foundations Benchmark 1
[4] Standards Mapping - CIS Google Kubernetes Engine Benchmark normal
[5] Standards Mapping - Common Weakness Enumeration CWE ID 398, CWE ID 710
[6] Standards Mapping - Smart Contract Weakness Classification SWC-119
desc.structural.solidity.swc119