Standard Hoare logic cannot easily handle pointer aliasing (two variables pointing to the same memory cell). How does separation logic address this?
Think about your answer, then reveal below.
Model answer: The separating conjunction x -> v * y -> w inherently asserts that x and y point to different cells (disjoint heap regions). This makes non-aliasing the default in separation logic specifications. When aliasing IS intended, it must be expressed explicitly, typically by using a single points-to assertion x -> v and noting that y = x. This reversal of defaults — non-aliasing unless stated otherwise — eliminates the combinatorial explosion of aliasing cases that plagues standard Hoare logic.
In standard Hoare logic, if you have two pointers x and y, you must consider whether they alias (point to the same cell) or not, and proofs branch on every such possibility. With n pointers, this creates 2^(n choose 2) cases. Separation logic's * operator makes disjointness structural: x -> v * y -> w cannot be satisfied if x = y because the heap regions must be disjoint. This eliminates aliasing cases from proofs entirely unless aliasing is explicitly introduced.