Some Eclipse Foundation services are deprecated, or will be soon. Please ensure you've read this important communication.
View | Details | Raw Unified | Return to bug 247564 | Differences between
and this patch

Collapse All | Expand All

(-)a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/NullReferenceTest.java (-1 / +214 lines)
Lines 49-55 public NullReferenceTest(String name) { Link Here
49
// Only the highest compliance level is run; add the VM argument
49
// Only the highest compliance level is run; add the VM argument
50
// -Dcompliance=1.4 (for example) to lower it if needed
50
// -Dcompliance=1.4 (for example) to lower it if needed
51
static {
51
static {
52
//		TESTS_NAMES = new String[] { "testBug247564k_3" };
52
//		TESTS_NAMES = new String[] { "testBug247564b_1" };
53
//		TESTS_NUMBERS = new int[] { 561 };
53
//		TESTS_NUMBERS = new int[] { 561 };
54
//		TESTS_RANGE = new int[] { 1, 2049 };
54
//		TESTS_RANGE = new int[] { 1, 2049 };
55
}
55
}
Lines 16562-16567 public void testBug247564b_9() { Link Here
16562
		JavacTestOptions.Excuse.EclipseWarningConfiguredAsError);
16562
		JavacTestOptions.Excuse.EclipseWarningConfiguredAsError);
16563
}
16563
}
16564
16564
16565
// null analysis -- case for static final field initialized inside static block with different values
16566
// check if the resetting works properly i.e. null status for constant fields should not be 
16567
// reset on method calls. 
16568
// Boundary condition: field <boundary> constant local
16569
public void testBug247564b_10() {
16570
	Map compilerOptions = getCompilerOptions();
16571
	compilerOptions.put(CompilerOptions.OPTION_ReportNonStaticAccessToStatic, CompilerOptions.IGNORE);
16572
	this.runNegativeTest(
16573
		false,
16574
		new String[] {
16575
			"X.java",
16576
			"public class X {\n" +
16577
			"Object field0, \n" +
16578
			"field1, field2, field3, field4, \n" +
16579
			"field5, field6, field7, field8, \n" +
16580
			"field9, field10, field11, field12, \n" +
16581
			"field13, field14, field15, field16, \n" +
16582
			"field17, field18, field19, field20, \n" +
16583
			"field21, field22, field23, field24, \n" +
16584
			"field25, field26, field27, field28, \n" +
16585
			"field29, field30, field31, field32, \n" +
16586
			"field33, field34, field35, field36, \n" +
16587
			"field37, field38, field39, field40, \n" +
16588
			"field41, field42, field43, field44, \n" +
16589
			"field45, field46, field47, field48, \n" +
16590
			"field49, field50, field51, field52, \n" +
16591
			"field53, field54, field55, field56, \n" +
16592
			"field57, field58, field59, field60, \n" +
16593
			"field61, field62, field63;\n" +
16594
			"static final Object static64 = null;\n" +
16595
			"  void foo1(Object local65) {\n" +
16596
			"	 if (field63 == null) {\n" +
16597
			"		field63.toString(); // report NPE\n" +
16598
			"	 }\n" +
16599
			"	 if (static64 == null) { // redundant\n" +
16600
			"		static64.toString(); // report NPE\n" +
16601
			"	 }\n" +
16602
			"	 if (local65 == null) {\n" +
16603
			"		local65.toString(); // report NPE\n" +
16604
			"	 }\n" +
16605
			"	 if (field63 == null) {\n" +
16606
			"       this.toString();\n" +
16607
			"		field63.toString();\n" + // wiped by method call
16608
			"	 }\n" +
16609
			"	 if (static64 == null) { // always false\n" + // because we're past static64.toString()
16610
			"       this.toString(); // dead\n" +
16611
			"		static64.toString();\n" +
16612
			"	 }\n" +
16613
			"	 if (local65 == null) { // alwayws false\n" + // because we're past local65.toString()
16614
			"       this.toString(); // dead\n" +
16615
			"		local65.toString();\n" +
16616
			"	 }\n" +
16617
			"  }\n" +
16618
			"}\n"},
16619
		null,
16620
		compilerOptions,
16621
		"----------\n" + 
16622
		"1. ERROR in X.java (at line 22)\n" + 
16623
		"	field63.toString(); // report NPE\n" + 
16624
		"	^^^^^^^\n" + 
16625
		"Potential null pointer access: The field field63 may be null at this location\n" + 
16626
		"----------\n" + 
16627
		"2. ERROR in X.java (at line 24)\n" + 
16628
		"	if (static64 == null) { // redundant\n" + 
16629
		"	    ^^^^^^^^\n" + 
16630
		"Redundant null check: The field static64 can only be null at this location\n" + 
16631
		"----------\n" + 
16632
		"3. ERROR in X.java (at line 25)\n" + 
16633
		"	static64.toString(); // report NPE\n" + 
16634
		"	^^^^^^^^\n" + 
16635
		"Null pointer access: The field static64 can only be null at this location\n" + 
16636
		"----------\n" + 
16637
		"4. ERROR in X.java (at line 28)\n" + 
16638
		"	local65.toString(); // report NPE\n" + 
16639
		"	^^^^^^^\n" + 
16640
		"Null pointer access: The variable local65 can only be null at this location\n" + 
16641
		"----------\n" + 
16642
		"5. ERROR in X.java (at line 34)\n" + 
16643
		"	if (static64 == null) { // always false\n" + 
16644
		"	    ^^^^^^^^\n" + 
16645
		"Null comparison always yields false: The field static64 cannot be null at this location\n" + 
16646
		"----------\n" + 
16647
		"6. WARNING in X.java (at line 34)\n" + 
16648
		"	if (static64 == null) { // always false\n" + 
16649
		"       this.toString(); // dead\n" + 
16650
		"		static64.toString();\n" + 
16651
		"	 }\n" + 
16652
		"	                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
16653
		"Dead code\n" + 
16654
		"----------\n" + 
16655
		"7. ERROR in X.java (at line 38)\n" + 
16656
		"	if (local65 == null) { // alwayws false\n" + 
16657
		"	    ^^^^^^^\n" + 
16658
		"Null comparison always yields false: The variable local65 cannot be null at this location\n" + 
16659
		"----------\n" + 
16660
		"8. WARNING in X.java (at line 38)\n" + 
16661
		"	if (local65 == null) { // alwayws false\n" + 
16662
		"       this.toString(); // dead\n" + 
16663
		"		local65.toString();\n" + 
16664
		"	 }\n" + 
16665
		"	                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
16666
		"Dead code\n" + 
16667
		"----------\n",
16668
		JavacTestOptions.Excuse.EclipseWarningConfiguredAsError);
16669
}
16670
16671
// null analysis -- case for static final field initialized inside static block with different values
16672
// check if the resetting works properly i.e. null status for constant fields should not be 
16673
// reset on method calls. 
16674
// Boundary condition: constant field <boundary> local
16675
public void testBug247564b_11() {
16676
	Map compilerOptions = getCompilerOptions();
16677
	compilerOptions.put(CompilerOptions.OPTION_ReportNonStaticAccessToStatic, CompilerOptions.IGNORE);
16678
	this.runNegativeTest(
16679
		false,
16680
		new String[] {
16681
			"X.java",
16682
			"public class X {\n" +
16683
			"Object field0, \n" +
16684
			"field1, field2, field3, field4, \n" +
16685
			"field5, field6, field7, field8, \n" +
16686
			"field9, field10, field11, field12, \n" +
16687
			"field13, field14, field15, field16, \n" +
16688
			"field17, field18, field19, field20, \n" +
16689
			"field21, field22, field23, field24, \n" +
16690
			"field25, field26, field27, field28, \n" +
16691
			"field29, field30, field31, field32, \n" +
16692
			"field33, field34, field35, field36, \n" +
16693
			"field37, field38, field39, field40, \n" +
16694
			"field41, field42, field43, field44, \n" +
16695
			"field45, field46, field47, field48, \n" +
16696
			"field49, field50, field51, field52, \n" +
16697
			"field53, field54, field55, field56, \n" +
16698
			"field57, field58, field59, field60, \n" +
16699
			"field61;\n" +
16700
			"static final Object static62 = null;\n" +
16701
			"Object field63;" +
16702
			"  void foo1(Object local64) {\n" +
16703
			"	 if (static62 == null) { // redundant\n" +
16704
			"		static62.toString(); // report NPE\n" +
16705
			"	 }\n" +
16706
			"	 if (field63 == null) {\n" +
16707
			"		field63.toString(); // report NPE\n" +
16708
			"	 }\n" +
16709
			"	 if (local64 == null) {\n" +
16710
			"		local64.toString(); // report NPE\n" +
16711
			"	 }\n" +
16712
			"	 if (static62 == null) { // always false\n" + // because we're past static64.toString()
16713
			"       this.toString(); // dead\n" +
16714
			"		static62.toString();\n" +
16715
			"	 }\n" +
16716
			"	 if (field63 == null) {\n" +
16717
			"       this.toString(); //\n" +
16718
			"		field63.toString();\n" + // wiped by method call
16719
			"	 }\n" +
16720
			"	 if (local64 == null) { // alwayws false\n" + // because we're past local64.toString()
16721
			"       this.toString(); // dead\n" +
16722
			"		local64.toString();\n" +
16723
			"	 }\n" +
16724
			"  }\n" +
16725
			"}\n"},
16726
		null,
16727
		compilerOptions,
16728
		"----------\n" + 
16729
		"1. ERROR in X.java (at line 21)\n" + 
16730
		"	if (static62 == null) { // redundant\n" + 
16731
		"	    ^^^^^^^^\n" + 
16732
		"Redundant null check: The field static62 can only be null at this location\n" + 
16733
		"----------\n" + 
16734
		"2. ERROR in X.java (at line 22)\n" + 
16735
		"	static62.toString(); // report NPE\n" + 
16736
		"	^^^^^^^^\n" + 
16737
		"Null pointer access: The field static62 can only be null at this location\n" + 
16738
		"----------\n" + 
16739
		"3. ERROR in X.java (at line 25)\n" + 
16740
		"	field63.toString(); // report NPE\n" + 
16741
		"	^^^^^^^\n" + 
16742
		"Potential null pointer access: The field field63 may be null at this location\n" + 
16743
		"----------\n" + 
16744
		"4. ERROR in X.java (at line 28)\n" + 
16745
		"	local64.toString(); // report NPE\n" + 
16746
		"	^^^^^^^\n" + 
16747
		"Null pointer access: The variable local64 can only be null at this location\n" + 
16748
		"----------\n" + 
16749
		"5. ERROR in X.java (at line 30)\n" + 
16750
		"	if (static62 == null) { // always false\n" + 
16751
		"	    ^^^^^^^^\n" + 
16752
		"Null comparison always yields false: The field static62 cannot be null at this location\n" + 
16753
		"----------\n" + 
16754
		"6. WARNING in X.java (at line 30)\n" + 
16755
		"	if (static62 == null) { // always false\n" + 
16756
		"       this.toString(); // dead\n" + 
16757
		"		static62.toString();\n" + 
16758
		"	 }\n" + 
16759
		"	                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
16760
		"Dead code\n" + 
16761
		"----------\n" + 
16762
		"7. ERROR in X.java (at line 38)\n" + 
16763
		"	if (local64 == null) { // alwayws false\n" + 
16764
		"	    ^^^^^^^\n" + 
16765
		"Null comparison always yields false: The variable local64 cannot be null at this location\n" + 
16766
		"----------\n" + 
16767
		"8. WARNING in X.java (at line 38)\n" + 
16768
		"	if (local64 == null) { // alwayws false\n" + 
16769
		"       this.toString(); // dead\n" + 
16770
		"		local64.toString();\n" + 
16771
		"	 }\n" + 
16772
		"	                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
16773
		"Dead code\n" + 
16774
		"----------\n",
16775
		JavacTestOptions.Excuse.EclipseWarningConfiguredAsError);
16776
}
16777
16565
// null analysis -- fields in synchronized methods
16778
// null analysis -- fields in synchronized methods
16566
// check that null analysis for fields in synchronized methods
16779
// check that null analysis for fields in synchronized methods
16567
// behave as it does in ordinary methods.
16780
// behave as it does in ordinary methods.
(-)a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/flow/UnconditionalFlowInfo.java (-1 / +2 lines)
Lines 1520-1526 public void resetNullInfo(VariableBinding local) { Link Here
1520
1520
1521
public void resetNullInfoForFields() {
1521
public void resetNullInfoForFields() {
1522
	if (this != DEAD_END) {
1522
	if (this != DEAD_END) {
1523
		long mask = (-1L << this.maxFieldCount) | this.constantFieldsMask;
1523
		long mask = this.maxFieldCount < BitCacheSize ? (-1L << this.maxFieldCount) : 0L; 
1524
		mask |= this.constantFieldsMask;
1524
		// first reset normal bits:
1525
		// first reset normal bits:
1525
		this.nullBit1 |= ~mask;
1526
		this.nullBit1 |= ~mask;
1526
		this.nullBit2 &= mask;
1527
		this.nullBit2 &= mask;

Return to bug 247564