Проблема с указателями NULL на платформе Harvard Architecture

Интересная проблема, с которой мы столкнулись на этой неделе.

Мы работаем на языке C на встроенной платформе Гарвардской архитектуры, которая имеет 16-битные адреса данных и 32-битные кодовые адреса.

Проблема возникает, когда вы работаете с указателями функций. Если у вас есть код вроде

if (fp) fp();

или

if (fp != 0) fp();

, все в порядке.

Однако, если у вас есть код вроде

if (fp != NULL) fp();

, то, поскольку NULL определяется как (void *) 0 , компилятор (в данном случае gcc) a) не предупреждает и б) выполняет 16-битное сравнение с указателем на функцию вместо 32-битного сравнения. Хорошо, если указатель на функцию не находится на границе 64k, поэтому все нижние 16 бит равны 0.

На данный момент у нас есть большие участки кода, которые содержат явные проверки на NULL. Большинство из них будут указателями на данные, но некоторые из них будут указателями на функции. Быстрый grep для ! = NULL или == NULL выявило более 3000 результатов, многие из которых должны были пройти вручную для проверки.

Итак, сейчас мы хотели бы либо

  1. способ найти все случаи, когда сравниваются указатели функций (но не указатели данных) (чтобы вместо этого мы могли сравнить их с FP_NULL, который мы бы определили как 32-битный 0) или

  2. , чтобы переопределить NULL таким образом, чтобы он поступал правильно.

  3. (Или, я полагаю, чтобы обновите наш порт gcc для обнаружения и

Я не могу придумать подход, который работал бы для 1. Единственный подход, который я могу придумать для 2, - это переопределить NULL как указатель на функцию 0, что было бы очень расточительно для подавляющего большинства сравнений с указателями данных. (32-битное сравнение - это 4 инструкции, 16-битное сравнение - это 1 инструкция).

Есть мысли или предложения?

17
задан ROMANIA_engineer 19 November 2016 в 20:11
поделиться