Unfortunately, most pointer analyses have difficulty analyzing this program precisely. In order to determine points-to sets, a pointer analysis must be able to "name" a program's objects. In general, programs can allocate an unbounded number of objects; but in order to terminate, a pointer analysis can only use a finite set of names. A typical approximation is to give all the objects allocated on a given line of the program the same name. In the example above, all the objects constructed at line would have the same name. Therefore, when the codice_4 statement is analyzed for the first time, the analysis determines that one of the objects named [1 is being deleted. The second time the statement is analyzed (since it is in a loop) the analysis warns of a possible error: since it is unable to distinguish the objects in the array, it may be that the second codice_4 is deleting the same object as the first codice_4. This warning is spurious, and the goal of shape analysis is to avoid such warnings.