2

scala コンパイラの Y 警告を使用しようとしていますが、正しく行っているとは思えません。以下の例では、nums は使用されていないため、 -Ywarn-value-discard がその警告を出力することを期待しています。2 つの if 条件があり、一方は他方の内部にネストされています。子 if の条件は親の条件と正反対であるため、その中のすべてがデッド コードです。しかし、 -Ywarn-dead-code はそれに対して警告しません。誰かが私が間違っているかもしれないことを提案してもらえますか? 任意のポインタをいただければ幸いです。

object DeadCodeWarn{
  def main( args: Array[ String ] ) {
    val nums = 1 to 100
    //There should be a warning for squares
    //as its a non-unit expression thats not
    //used in any computation. Y-warn-value-discard
    val squares = nums.map( x => x * x ) 

    if( nums.length == 100 ){
      println( "should be printed" )
      if( nums.length !=100 )
      {
        //-Ywarn-dead-code
        println( "Dead code, so should be warned against" )
      }
    }
  }
}

$scalac -Xlint -Ywarn-all DeadCodeWarn.scala黙って成功します。

4

2 に答える 2

4

-Ywarn-value-discard

val値は破棄されず、 !に割り当てられます。問題はval未使用です

コード付き:

package foo

case class Foo(x: Int) {
  def foo: Int = {
    val y = 2;
    x
  }
}

私は scalac 2.11.5 と-Ywarn-unused:

[warn] /.../foo.scala:5: local val in method foo is never used
[warn]     val y = 2;

-Ywarn-dead-code

一般的なロジックが機能しない反例を書くのは簡単です:

// Evil mutable class
class Arrayish {
  private var x: Int = 100
  def length(): Int = {
    val res = x
    x += 1
    res
  }
}

def test(nums: Arrayish): Unit =
  if (nums.length == 100) {
    println( "should be printed" )
    if (nums.length != 100) {
      println("Dead code, so should be warned against")
    }
  }

デッドコードが実行されます:

scala> test(new Arrayish())
should be printed
Dead code, so should be warned against

または

class NonEqual {
  def ==(x: Int): Boolean = true
  def !=(x: Int): Boolean = true
}

class NaNLength {
  val length: NonEqual = new NonEqual
}

def test2(nums: NaNLength): Unit =
  if (nums.length == 100) {
    println("should be printed")
    if (nums.length != 100) {
      println("Dead code, so should be warned against")
    }
  }

デッド コードも実行されます。

scala> test2(new NaNLength)
should be printed
Dead code, so should be warned against

Scalac コンパイラは、適切に動作するケースとそうでないケースを区別するほどスマートではありません。


バグ/機能リクエストを送信する場合は、次のような例を挙げてください:

def test3(nums: Array[Int]): Unit = {
  if (true) {
    println("should be printed")
    if (false) {
      println("Dead code, so should be warned against")
    }
  }
}

def test4(nums: Array[Int]): Unit = {
  val hundred = nums.length == 100
  if (hundred) {
    println("should be printed")
    if (!hundred) {
      println("Dead code, so should be warned against")
    }
  }
}

scalac デッド コード レポーターは、たとえば Java ほど洗練されていないようです。scalac がこれらの例を適切に最適化してくれることを願っていますが、複雑すぎてはいけません。

于 2015-02-11T05:29:42.797 に答える