If I set up a mailing to a smart group, and schedule it to go out one month from today, will CiviMail send to the contacts in the smart group as they are defined at the point when I create the mailing, or at the point when the mailing is sent out?
CiviMail does this at the time when the mailing is created, i.e. when the groups are chosen etc.
The primary reason behind this is to account for permissioning and what contacts to send the mailing to. Doing so at mailing creation time is relatively easy, since we know the contact id of the user, and hence know what contacts the user has permission to send mail to.
It gets a lot more complicated (but not impossible) to do this during mail delivery, primarily because the cron job will need to evaluate the groups in the context of the person who created the mailing
The function that creates the recipient list is the unfortunately named CRM_Mailing_BAO_Mailing::getRecipients() which clears out the rows in table civicrm_mailing_recipients and reinserts them.
It's called when editing and scheduling the email, but not when it is about to be sent.
I do not know out of the top of my head, but I would start checking by looking at the table civicrm_mailing_recipients. If the contacts in there are added at the time of mailing creation I know where I would put my money :-)
I can confirm that this is still the behaviour of civiMail and Smart Groups.
There is an extension that addresses this: