We address the problem of automatic synthesis of assertions on sequential programs with singly-linked lists containing data over infinite domains such as integers or reals. Our approach is based on an accurate abstract inter-procedural analysis. Program configurations are represented by graphs where nodes represent list segments without sharing. The data in these list segments are characterized by constraints in abstract domains. We consider a domain where constraints are in a universally quantified fragment of the first-order logic over sequences, as well as a domain constraining the multisets of data in sequences.Our analysis computes the effect of each procedure in a local manner, by considering only the reachable part of the heap from its actual parameters. In order to avoid losses of information, we introduce a mechanism based on unfolding/folding operations allowing to strengthen the analysis in the domain of first-order formulas by the analysis in the multisets domain.The same mechanism is used for strengthening the sound (but incomplete) entailment operator of the domain of first-order formulas. We have implemented our techniques in a prototype tool and we have shown that our approach is powerful enough for automatic (1) generation of non-trivial procedure summaries, (2) pre/postcondition reasoning, and (3) procedure equivalence checking. 1 typedef struct list { 2 int data; 3 struct list *next; 4 } list ; 5 list * quicksort(list *a){ 6 list *left,*right,*pivot,*res,*start; 7 int d; 8 if (a == NULL || a->next == NULL) 9 res = clone(a); 10 else { 11 d = a->data; 12 pivot = create(1); // list of length 1 13 pivot->data = d; 14 start = a->next; 15 split(start,d,&left,&right); 16 left = quicksort(left); 17 right = quicksort(right); 18 res = concat(left,pivot,right); } 19 return res; } Figure 1. The quicksort algorithm on singly-linked lists.