Я пишу C-код, который делает определенные предположения о реализации, такие как:
-
char
- 8 бит. - подписанные интегральные типы - это два дополнения.
-
>>
по целым символам sign-extends. - целочисленное деление округляет отрицательные отношения к нулю.
-
double
- это удваивает IEEE-754 и может быть пустым для строки и изuint64_t
с ожидаемым результатом. - сравнения с участием NaN всегда оцениваются как false.
- нулевой указатель - это все нулевые биты.
- все указатели данных имеют одинаковое представление и могут быть преобразованы в
size_t
и обратно без потери информации. - арифметика указателя на
char*
такая же, как обычная арифметика наsize_t
. - указатели функций могут быть переведены на
void*
и обратно без потери информации.
Теперь все это вещи, которые стандарт C не гарантирует, поэтому, строго говоря, мой код не переносится. Тем не менее, они оказываются истинными на архитектурах и ABI, которые я нахожу в настоящее время, и после тщательного рассмотрения я решил, что риск, который им не удастся удержать в какой-либо архитектуре, которую мне нужно настроить в будущем, является приемлемо низким по сравнению с прагматическими преимуществами, которые я получаю сейчас от сделанных предположений.
Вопрос: как лучше всего документировать это решение? Многие из моих предположений сделаны практически всеми (не-октетные char
s? Или знаковые значения целых чисел в будущей, коммерчески успешной архитектуре?). Другие более спорны - наиболее рискованно, вероятно, является одним из указателей на функции. Но если я просто перечислил все, что я предполагаю, помимо того, что дает мне стандарт, глаза читателя просто затуманиваются, и он может не заметить тех, которые на самом деле имеют значение.
Итак, есть ли какой-то известный набор предположений о том, что я являюсь "несколько ортодоксальной" архитектурой, которую я могу включить в качестве ссылки, а затем только явным образом документирую, где я выхожу за пределы этого? (Фактически такой "профиль" будет определять новый язык, который является надмножеством C, но он может не признать, что во многих словах - и это может быть и не прагматически полезным способом думать об этом).
Уточнение. Я ищу короткий документ для документирования своих вариантов, а не для автоматического тестирования, соответствует ли данный компилятор моим ожиданиям. Последнее, очевидно, тоже полезно, но не решает все. Например, если бизнес-партнер свяжется с нами, говоря: "Мы создаем устройство на базе нового чипа G2015 Google, будет ли ваше программное обеспечение работать на нем?" - тогда было бы хорошо иметь возможность ответить "мы еще не работали с этой аркой, но это не должно быть проблемой, если у нее есть компилятор C, который удовлетворяет такому-то".
Уточнить еще больше, поскольку кто-то проголосовал за закрытие как "не конструктивный": я не ищу здесь обсуждения, просто для указателей на фактические, существующие, официальные документы, которые могут упростить мою документацию включен в качестве ссылки.