param_set: handle NULL and POISON assignments better
The problem with this was that the list_del() function was returning
nonsense information in the cross function database.
The list_del() function looks like this:
static inline void list_del(struct list_head *entry)
{
__list_del_entry(entry);
entry->next = LIST_POISON1;
entry->prev = LIST_POISON2;
}
What Smatch was doing was saying that "entry->next = LIST_POISON1;" gets
translated into one real assignment and a bunch of fake assignments like
"entry->next->prev = fake thing;" which sets it to unknown. Then it was
saying that "entry->next->prev->prev = fake thing;" which meant that the
first part goes from unknown to valid pointer. Which then gets stored in
the cross function DB.
We should say that if "p" is NULL the "p->member" is not a fake unknown but
is instead an empty state.
Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>