Переопределить то я могу, но хотелось бы избавить общественность от ошибки 

 А я ее и без переопределения могу использовать, вот установка нуля:
- Код: Выделить всё
- semctl(SemHandle, 0, SEM_SETVAL, PSemun(0)^);
Самым лучшим доказательством будет пример использования этой функции прямо в других C-программах:
- Код: Выделить всё
- void init_semaphore( int sid, int semnum, int initval)
 {
 union semun semopts;
 
 semopts.val = initval;
 semctl( sid, semnum, SETVAL, semopts);
 }
Как видите, четвертым параметром передается сам semopts, а не ссылка на него. А если использовать декларацию из unix/ipc.pp, например для установки значения, то либо вызов возвращает ошибку ERANGE, либо устанавливает совсем левое, весьма высокое значение семафора.
Да и если посмотреть на описание SEmun, то непонятно зачем передавать его как var-параметр, ведь те поля, которые данная функция может записывать, уже являются указателями, адрес самого semun ей совершенно для этого не нужен.